Intoduction: Handling the files: reading multiple csv files into the same dataframe-called RawData. Data will be organized into a specific template, some raws within the RawData will be extracted into a new dataframe - Those will be the data regarding the whole cells. This small dataframe will be organized, some data will be normalized and some will be added-dataframe is called CellsDataC. The rest, as well, will be assigned into a new dataframe- called Data2Handle: this data will be cleaned, reorganized and some rows will be eliminated-due to resolution issues.

library(ggplot2)
Want to understand how all the pieces fit together? Read R for Data Science:
https://r4ds.had.co.nz/
library(dplyr)

Attaching package: ‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
library(tidyr)
library(tibble)
library(stringr)
library(reshape2)

Attaching package: ‘reshape2’

The following object is masked from ‘package:tidyr’:

    smiths
library(rlist)
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
library(readr)
library(purrr)
library(dgof)

Attaching package: ‘dgof’

The following object is masked from ‘package:stats’:

    ks.test
library(car)
Loading required package: carData

Attaching package: ‘car’

The following object is masked from ‘package:purrr’:

    some

The following object is masked from ‘package:dplyr’:

    recode
library(Rmisc)
Loading required package: lattice
Loading required package: plyr
-----------------------------------------------------------------------------------------
You have loaded plyr after dplyr - this is likely to cause problems.
If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
library(plyr); library(dplyr)
-----------------------------------------------------------------------------------------

Attaching package: ‘plyr’

The following object is masked from ‘package:purrr’:

    compact

The following objects are masked from ‘package:dplyr’:

    arrange, count, desc, failwith, id, mutate, rename, summarise, summarize
#library(agricolae)
library(jtools)
library(xlsx)
RawData <- list.files(full.names = TRUE) %>% 
  lapply(read_csv) %>% 
  bind_rows
Warning: One or more parsing issues, see `problems()` for detailsRows: 691 Columns: 1── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): ---
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 252 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 200 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 155 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 206 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 254 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 90 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 164 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 142 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 266 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 180 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 228 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 140 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 196 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 152 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 213 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 113 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 329 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 217 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 207 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 175 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 110 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 146 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 180 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 206 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 202 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 217 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 111 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 102 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 173 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 156 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 164 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 149 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 195 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 103 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 187 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 301 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 301 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 271 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 171 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 163 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 229 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 230 Columns: 10── Column specification ───────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 271 Columns: 10── Column specification ────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 318 Columns: 10── Column specification ────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 320 Columns: 10── Column specification ────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 271 Columns: 10── Column specification ────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 302 Columns: 10── Column specification ────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 110 Columns: 10── Column specification ────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 201 Columns: 10── Column specification ────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 141 Columns: 10── Column specification ────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 204 Columns: 10── Column specification ────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 88 Columns: 10── Column specification ────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 215 Columns: 10── Column specification ────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 233 Columns: 10── Column specification ────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 130 Columns: 10── Column specification ────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 135 Columns: 10── Column specification ────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 201 Columns: 10── Column specification ────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 228 Columns: 10── Column specification ────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 351 Columns: 10── Column specification ────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 248 Columns: 10── Column specification ────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 195 Columns: 10── Column specification ────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 129 Columns: 10── Column specification ────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 246 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 124 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 246 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 412 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 127 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 282 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 227 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 209 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 96 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 227 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 71 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 98 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 131 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 257 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 94 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 450 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 219 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 223 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 229 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 145 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 129 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 315 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 232 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 188 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 135 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 121 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 206 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 143 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 91 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 106 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 102 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 143 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 131 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 169 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 115 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 104 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 107 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 158 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 111 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 125 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 290 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 202 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 163 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 121 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 92 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 73 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 168 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 228 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 200 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 106 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 117 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 135 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.New names:Rows: 154 Columns: 10── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): Label
dbl (9): ...1, Area, Mean, StdDev, IntDen, Median, RawIntDen, MinThr, MaxThr
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
#Reading multiple csv files into the same dataframe, with only one Head # when the file only contains the data and the R-notebook

Rdata <- RawData %>% drop_na(Label) #dropping NA rows
Rdata <- Rdata[,-c(1)] #deleting extra non-informative columns that appears while reading the csv file to the dataframe
Data2Handle <- Rdata%>%
  separate(Label,c("Treatment","CellNumber"),sep = "_") #%>% #seperating the label column into 2 diffrenet columns labeled as treatment and cell number- these two variables identify diffrernt cells within the same treatment, both are needed in the next steps of analysis

Data2Handle <- select(Data2Handle,-c(MinThr,MaxThr)) #deleting another 2 non-informative columns
Data2Handle[Data2Handle$Treatment=='ShA1/2+ShB1/2+s97',]$Treatment <- c('2ShA+2ShB+s97')
Data2Handle[Data2Handle$Treatment=='1ShA+1ShB+s97',]$Treatment <- c('2ShA+2ShB+s97')
Data2Handle[Data2Handle$Treatment=='sha34+shb14+s97',]$Treatment <- c('3ShA+1ShB+s97')
Data2Handle[Data2Handle$Treatment=='shb3+sha1+s97',]$Treatment <- c('1ShA+3ShB+s97')
Data2Handle[Data2Handle$Treatment=='ShA4+ShB0+s97',]$Treatment <- c('4ShA+0ShB+s97')
Data2Handle[Data2Handle$Treatment=='ShA0+ShB4+s97',]$Treatment <- c('0ShA+4ShB+s97')
Data2Handle[Data2Handle$Treatment=='shb34+sha14+s97',]$Treatment <- c('1ShA+3ShB+s97')
Data2Handle[Data2Handle$Treatment=='ShA3+ShB1+s97',]$Treatment <- c('3ShA+1ShB+s97')
Data2Handle[Data2Handle$Treatment=='ShA1+ShB3+s97',]$Treatment <- c('1ShA+3ShB+s97')
Data2Handle[Data2Handle$Treatment=='ShA2+ShB2+s97',]$Treatment <- c('2ShA+2ShB+s97')


CellsDataC <- Data2Handle[Data2Handle$Area>100,] # subsetting the data for the whole cell into a new dataframe, in each csv file there is one row for the whole cell- these data contains information about cells 
Data2Handle <- Data2Handle[Data2Handle$Area<100 ,] #eliminating the rows of data regarding the whole cells">300" and also the rows where the clusters area smaller than the resolution of the microscope
CellsData <-  Data2Handle %>%
  group_by(Treatment) %>%
  group_by(CellNumber,.add = TRUE) %>%
  dplyr::summarise(ClusterCount = n(),SumofRawIntDen=sum(RawIntDen),.groups = "keep") #grouping the cells data by treatment and cell number-both variables needed to identify unique cells from each other as written before- and then counting for each cell the cluster number(aka the rows in each file which belong to the specific cell)
CellsDataC <- merge(CellsDataC,CellsData, by=c("Treatment","CellNumber"))
#grouping the cells data by treatment and cell number-both variables needed to identify unique cells from each other as written before- and then counting for each cell the cluster number(aka the rows in each file which belong to the specific cell)
CellsDataC <- CellsDataC %>%
  mutate(ClustersNumberPerCell=ClusterCount/Area,
         non_normlizedClusterNumber=ClusterCount,
         CellSurfaceExpression=RawIntDen/Area,
         FractionofChannelsinClusters=SumofRawIntDen/RawIntDen)
CellsDataC <- CellsDataC[,-9]
#CellsDataC$ClustersNumberPerCell <- CellsData$ClusterCount/CellsDataC$Area
#CellsDataC$non_normlizedClusterNumber<- CellsData$ClusterCount#adding the vairable ClusterCount to the CellsDataC
#CellsDataC$CellSurfaceExpression <- CellsDataC$RawIntDen/CellsDataC$Area #adding the vairable CellSurfaceExpression to the CellsDataC- defined as the clusternumbers per cell normalized to the whole cell area (since a higher area of membrane will contain as well a higher number of clusters)  
#CellsDataC$FractionofChannelsinClusters=CellsData$SumofRawIntDen/CellsDataC$RawIntDen
#CellsDataC$SumofRawIntDen <- CellsData$SumofRawIntDen
#CellsDataC #showing the data to have a general look


Data2Handle <-Data2Handle %>%
  mutate(Density= RawIntDen/Area) # adding a new variable calculated by the area and RawIntDen variables in the data for each cluster in the cells, defined as Density
Data2Handle<- Data2Handle[,-9]#showing the data to have a general look
Data2Handle
CellsDataC

CellsData_sum <-  Data2Handle %>%
  group_by(Treatment) %>%
  group_by(CellNumber,.add = TRUE) %>%
  dplyr::summarise(ClusterCount = n(),MeanDen = mean(Density),MeanArea = mean(Area),Standardddensity= sd(Density),StandarddArea= sd(Area),.groups = "keep")
write.csv(CellsData_sum,"CellsData_sum.csv", row.names = TRUE)

write.xlsx(CellsDataC,"CellsDataC_sum.xlsx", row.names = TRUE)

User must give as an input the number of variables he wants to be analyzed and their exact names as they show up in the Data: Data2Handle or CellsDataC. the input in the variable VariableToAnalyze will be used in next chunks to decide whether to run a specific commands or not-that is to run only the parts for the variables shows in VariableToAnalyze as the user decide However, rigth now this chunk is deactivated- and the value of VariableToAnalyze has been assigned as all the variables to be analyzed .

numberofvar <- as.integer(readline(prompt=paste("How many you want to analyze:"))) #asking the user to decide how many variables he want to analyze 
4
numvec <- c(1:numberofvar) # creating vector of number according to the varaible number input in the previous command
inputvec <- function(num=0)#function to take multiple variable names
  #argument: the number of the variable to take as an input, to show to it to the user
  #value: the exact name of the variable to analyse -as it showes in the dataframe
{
  vec <- readline(prompt=paste("what is your", num, "variable exact name "))
  return(vec)
}
VariableToAnalyze <- sapply(numvec, inputvec)# vectorized command to take as an input the exact names of the variables to be analyzed
Density
Area
ClustersNumberPerCell
CellSurfaceExpression

The next chuck will process the Data for the specific variables given in VariableToAnalyze: the function will perform Kolmogorov-Smirnov Normality test and Levene’s test for homoscedasticity. The result for the variables will be assigned in a new dataframe with the proper column names. Note: True in the new dataframe-indicate4transformationAll stands for p-value<0.05 (aka the assumption is violated)

DeterminePropTest <- function(VarName,Data)
  #description of the function: the function accept as an argumnt the variable name as it displayed in the data and check homogeneity of variance across groups and normality of residuals
  #argument-the name of variable to check and the data
  #value- vector of logical values (true stands for assumption violation) the 1st-homogeneity-levene's test, the 2nd- Kolmogorov-Smirnov Tests
{
names(Data)[names(Data) == VarName] <- "VarName" #in order to perform the test on a specific variable, changing the name of this variable to VarName- this make it easier to generalize the code, thus it could handle all the variable names as will be seen in next commands
  Model  = lm(VarName ~ Treatment,
              data=Data) #creating the model for Anova- defining the dependent and independent variables 
Anova(Model)   
summary(Model)
#all these parameters sets the model for further analysis
vec <- as.integer(readline(prompt=paste("Do you want to see the plots (Residuals Histogram and Residuals vs. predicted values) of the variable",VarName,"Yes-1, No-0 "))) #according to the user choice-shows or not-the plots to assess the data by himself in addition to the test carried out in the function
if (vec==1) 
  {hist(residuals(Model),col="darkgray")
#plot(fitted(Model),residuals(Model)) #plotting the fitted data to see The distribution of these residuals as it should be approximately normal.
qqnorm(Model$residuals)  # Another method of looking at the residuals normality
qqline(Model$residuals)# setting the normal line, in order to assist the residuals normality
pvaluelevene <- leveneTest(VarName ~ Treatment,data=Data,center=mean)[1,3] #assigning the p-value of levens test into a new variable
pvalueks <- ks.test(Model$residuals,pnorm,mean(Model$residuals),sd(Model$residuals))[[2]] #assigning the p-value of ks into a new variable
return (c(pvaluelevene<0.01,pvalueks<0.01)) #returning both values
}else
{pvaluelevene <- leveneTest(VarName ~ Treatment,data=Data,center=mean)[1,3]#assigning the p-value of levens test into a new variable
pvalueks <- ks.test(Model$residuals,pnorm,mean(Model$residuals),sd(Model$residuals))[[2]]#assigning the p-value of ks into a new variable
return (c(pvaluelevene<0.01,pvalueks<0.01))} #returning both values
}
#result4Transofrmation <- DeterminePropTest("ClustersNumberPerCell", CellsDataC)
#VariableToAnalyze <- c('ClustersNumberPerCell','Density','Area','CellSurfaceExpression')
#x <- VariableToAnalyze[VariableToAnalyze=='ClustersNumberPerCell']
indicate4transformationW <- t(sapply(VariableToAnalyze[VariableToAnalyze=='ClustersNumberPerCell'|VariableToAnalyze=='CellSurfaceExpression'|VariableToAnalyze=='FractionofChannelsinClusters'], DeterminePropTest, CellsDataC)) #subsetting the variables name belongging to the dataframe CellsDataC, on these variables, the function is called
1

Warning: group coerced to factor.
1

Warning: group coerced to factor.
1

Warning: group coerced to factor.

indicate4transformationC <- t(sapply(VariableToAnalyze[VariableToAnalyze=='Area'|VariableToAnalyze=='Density'], DeterminePropTest, Data2Handle)) #subsetting the variables name belongging to the dataframe Data2Handle, on these variables, the function is called
1

Warning: group coerced to factor.Warning: default ks.test() cannot compute correct p-values with ties;
 see help page for one-sample Kolmogorov test for discrete distributions.
1

Warning: group coerced to factor.Warning: default ks.test() cannot compute correct p-values with ties;
 see help page for one-sample Kolmogorov test for discrete distributions.

# a result of True for both columns stands for a need of transformation in the variable- shows in name of the row 
if (length(indicate4transformationC)!=0){ # this condition is to handle a situation where is no variables given by the user in the second chunk
  colnames(indicate4transformationC) <- c("Levene's test", "Kolmogorov-Smirnov Tests") #setting the column names
  indicate4transformationC #showingg the results
  indicate4transformationC <- as.data.frame(indicate4transformationC) %>%
  add_column(VarN=VariableToAnalyze[VariableToAnalyze=='Area'|VariableToAnalyze=='Density'],.before=1) #adding a new column with the variable names
row.names(indicate4transformationC) <- NULL #resetting the the rownames
indicate4transformationC
}
 if (length(indicate4transformationW)!=0){ # this condition is to handle a sitution where is no variables given by the user in the second chunk 
  colnames(indicate4transformationW) <- c("Levene's test", "Kolmogorov-Smirnov Tests")#setting the column names
  indicate4transformationW #showingg the results
indicate4transformationW <- as.data.frame(indicate4transformationW) %>%
  add_column(VarN=VariableToAnalyze[VariableToAnalyze=='ClustersNumberPerCell'|VariableToAnalyze=='CellSurfaceExpression'|VariableToAnalyze=='FractionofChannelsinClusters'],.before=1) #adding a new column with the variable names
row.names(indicate4transformationW) <- NULL #resetting the the rownames
indicate4transformationW
}
indicate4transformationAll <- rbind.data.frame(indicate4transformationC,indicate4transformationW) #bindingg the dataframes togather
indicate4transformationAll

This chunk is responsible for calculating the transformation when ever needed. the transformation type is determined by an Manual calibration of my own data behavior. also here the transformation is carried out only when the data met the conditions to perform one (when both assumptions: normality and homoscedasticity, are violated) Note: I used the “->>” whitch makes the data global, This allowed me to change and update directly both dataframes whenever i needed(CellsDataC/Data2Handle)

trans.log <- function(x){return(log2(x))} #mathmatical function for transformation calculation
trans.sqrt <- function(x){return(sqrt(x+0.5))} #mathmatical function for transformation calculation
trans.receip <- function(x){return(1/(x))} #mathmatical function for transformation calculation
#old <- Data2Handle
#Data2Handle <- backup
TransUpdate <- function(VarRow)
  #function description: the function accept as arggument/input a row of dataframe, containeing 3 columns. the first row is the variable needed to tranform the second and the third are the result of levenes and ks test - True stands for a p-value lower than 0.05 (both true stands for a need of transformation of the data for this specific variable)
  #outpot is a dataframe updated with a column of transformated data of variable
{
  #VarRow <- indicate4transformation[2,]
  Data2Handle<<-Data2Handle # changing the dataframe of each cluster to be global/ also shows in the function itself
  CellsDataC<<-CellsDataC# changing the dataframe of the whole cells to be global/ also shows in the function itself
  if (VarRow[1] %in% c("Density","Area")) #checking if the variable belong to the data of clusters
  {
    if (VarRow[1]=="Density"){ #if the variable in the argument is density, then calculating the appropriate type of transformation for the density
      Data2Handle$Density.trans<<- sapply(Data2Handle$Density,trans.sqrt)
    } else{ #if the variable in the argument is Area, then calculating the appropriate type of transformation for the area
      Data2Handle$Area.trans<<- sapply(Data2Handle$Area,trans.log)}
  }else #otherwise, the variable belong to the whole cell data
  {
    if (VarRow[1]=='CellSurfaceExpression'){CellsDataC$CellSurfaceExpression.trans <<- sapply(CellsDataC$CellSurfaceExpression,trans.sqrt)} #if the variable in the argument is CellSurfaceExpression, then calculating the appropriate type of transformation for the CellSurfaceExpression
      else{CellsDataC$ClustersNumberPerCell.trans <<- sapply(CellsDataC$ClustersNumberPerCell,trans.receip)} #if the variable in the argument is ClustersNumberPerCell, then calculating the appropriate type of transformation for the ClustersNumberPerCell
  }
  
  CellsDataC<<-CellsDataC
  Data2Handle<<-Data2Handle 
}
if(!is.null(indicate4transformationAll)){
apply(indicate4transformationAll[indicate4transformationAll$`Levene's test`==T & indicate4transformationAll$`Kolmogorov-Smirnov Tests`==T,],MARGIN=1,TransUpdate)} #applying the function on the data frame
$`1`

$`2`
#please pay attention, the apply is suitable for updating global variables
Data2Handle
CellsDataC
NA

This chunk contain all the possible statistics test suitable for a numeric dependent variable and a independent variable with more then two levels. This is needed since i have partial data for now, i don’t know whether my data will violate both assumption in the future or not, so just in case. The tests will be performed according to indicate4transformationAll results. When the conditions aren’t met, A Null dataframe will be sent to the test so no result will be shown. As it could be seen my partial data will need ANOVA (after transformation/ with no transformation)


welchtest <- function(varname, Data)
  # description: the function takes as an argument a variable that is found in the data, along with variable needed to be tested the function takes also the data itself.
  #output: Null, the function shows the result of welch test of the variable
{
  names(Data)[names(Data) == varname] <- "varname" #changing the column name-in the argumnets- to varname, this helps generlaizing the code, so it would run in each variable name
  oneway.test(varname ~ Treatment,
            data=Data,
            var.equal=FALSE) #performing the test
}
print("Welch test result if the conditions are met is below")
[1] "Welch test result if the conditions are met is below"
CWelch <- sapply(indicate4transformationAll[indicate4transformationAll$`Levene's test`==T & indicate4transformationAll$`Kolmogorov-Smirnov Tests`==F & (indicate4transformationAll$VarN=='Area'|indicate4transformationAll$VarN=='Density'),1], welchtest, Data2Handle)
sapply(indicate4transformationAll[indicate4transformationAll$`Levene's test`==T & indicate4transformationAll$`Kolmogorov-Smirnov Tests`==F & (indicate4transformationAll$VarN=='CellSurfaceExpression'|indicate4transformationAll$VarN=='ClustersNumberPerCell'),1], welchtest, CellsDataC)
          CellSurfaceExpression                                     
statistic 2.929638                                                  
parameter numeric,2                                                 
p.value   0.02891893                                                
method    "One-way analysis of means (not assuming equal variances)"
data.name "varname and Treatment"                                   
#both commands send the the two diffrenet Dataframe i have to the function for welch-test with the relavant variable name, only when the result of levens and Kolmogorov-Smirno is T,F respectivly - that is heteroscedasticity is found in the diffrent groups. this is done by sending the appropriate dataframe with the variable to test.
####################

KWtest <- function(varname, Data)
  # description: the function takes as an argument a variable that is found in the data, along with variable needed to be tested the function takes also the data itself.
  #output: Null, the function shows the result of Kruskal-walis test of the variable
{
  names(Data)[names(Data) == varname] <- "varname" #changing the column name-in the argumnets- to varname, this helps generlaizing the code, so it would run in each variable name
  kruskal.test(varname ~ Treatment,
                data = Data) #performing the test
}
print("Kruskal-Wallis test result if the conditions are met is below")
[1] "Kruskal-Wallis test result if the conditions are met is below"
sapply(indicate4transformationAll[indicate4transformationAll$`Levene's test`==F & indicate4transformationAll$`Kolmogorov-Smirnov Tests`==T & (indicate4transformationAll$VarN=='Area'|indicate4transformationAll$VarN=='Density'),1], KWtest, Data2Handle)
named list()
sapply(indicate4transformationAll[indicate4transformationAll$`Levene's test`==F & indicate4transformationAll$`Kolmogorov-Smirnov Tests`==T & (indicate4transformationAll$VarN=='CellSurfaceExpression'|indicate4transformationAll$VarN=='ClustersNumberPerCell'),1], KWtest, CellsDataC)
named list()
#both commands send the the two diffrenet Dataframe i have to the function for kruskal-wallis, only when the result of levens and Kolmogorov-Smirno is F,T respectivly - that is Normality assumption is violated. this is done each time by sending the appropriate dataframe with the variable to test.
#############


Anovatest <- function(varname, Data)
  # description: the function takes as an argument a variable that is found in the data, along with variable needed to be tested the function takes also the data itself.
  #output: Null, the function shows the result of Anova test of the variable
{
  names(Data)[names(Data) == varname] <- "varname"
  Model  = lm(varname ~ Treatment,
              data=Data) #creating the model for Anova- defining the dependent and independent variables (Variable to analysis and Treatment respectively)
c <- c(unlist(anova(Model)[1,4:5]) )#
return(c)
}
#############

print("ANOVA test result if the conditions are met is below")
[1] "ANOVA test result if the conditions are met is below"
new4anova <- indicate4transformationAll[(indicate4transformationAll$`Levene's test`==F & indicate4transformationAll$`Kolmogorov-Smirnov Tests`==F) |(indicate4transformationAll$`Levene's test`==T & indicate4transformationAll$`Kolmogorov-Smirnov Tests`==T),] #subsetiing the variables suitable for ANOVA test (transformed data and data which is Normal and has homogeneity of variances), from the result dataframe of levens and Kolmogorov-Smirnov.

new4anova[(indicate4transformationAll$`Levene's test`==T & indicate4transformationAll$`Kolmogorov-Smirnov Tests`==T),]$VarN <- sapply(new4anova[(indicate4transformationAll$`Levene's test`==T & indicate4transformationAll$`Kolmogorov-Smirnov Tests`==T),]$VarN,paste,sep=".","trans")
#updating the results dataframe first column when the variable in the row is transformated.

AnovaresC <- sapply(new4anova[(new4anova$VarN=="Density.trans" | new4anova$VarN=="Area.trans" |new4anova$VarN=="Density" | new4anova$VarN=="Area"),1],Anovatest, Data2Handle)
#appling ANOVA on the variables suited with the test in the Dataframe of the clusters
AnovaresW <- sapply(new4anova[(new4anova$VarN=="CellSurfaceExpression.trans" | new4anova$VarN=="ClustersNumberPerCell.trans"|new4anova$VarN=="CellSurfaceExpression" | new4anova$VarN=="ClustersNumberPerCell"),1],Anovatest, CellsDataC)
#appling ANOVA on the variables suited with the test in the Dataframe of whole cells

AnovaresC
          Area.trans Density.trans
F value 6.654356e+00  3.506711e+02
Pr(>F)  2.392309e-05 7.557020e-293
AnovaresW
        ClustersNumberPerCell
F value            2.19660787
Pr(>F)             0.07400829

this

#check differences in FractionofChannelsinClusters
AnovaresW_3 <- sapply("FractionofChannelsinClusters",Anovatest, CellsDataC)
AnovaresW_3
        FractionofChannelsinClusters
F value                 1.713494e+01
Pr(>F)                  5.968180e-11
#check 
#ModelFraction  = lm(FractionofChannelsinClusters ~ Treatment,
#              data=CellsDataC) #creating the model for Anova- defining the dependent and independent variables (Variable to analysis and Treatment respectively)
#summary(ModelFraction)

In this chuck a Tuckey pairwise multiple comparison (post-hoc) is done for all the variables.

library(agricolae)
#in all those commands a tukey multiple comparsion test is carried out
if ("Density" %in% VariableToAnalyze){
model  = lm(Density.trans ~ Treatment,
              data=Data2Handle) #creating the model for Anova- defining the dependent and independent variables (Variable to analysis-Density.trans and Treatment respectively)
PWDensity <- (HSD.test(model, "Treatment", group = F)) #tukey test
PWDensity}
$statistics
   MSerror    Df     Mean       CV
  4470.641 21210 430.2129 15.54181

$parameters
   test    name.t ntr StudentizedRange alpha
  Tukey Treatment   5         3.857987  0.05

$means
              Density.trans      std    r      Min      Max      Q25      Q50      Q75
0ShA+4ShB+s97      400.4135 68.73403 3291 244.1150 665.8430 348.1639 394.4883 445.6004
1ShA+3ShB+s97      418.2675 63.04118 4318 234.1932 717.2235 374.9122 414.7732 459.1624
2ShA+2ShB+s97      428.5679 66.76477 4497 251.5226 694.1119 379.4243 427.1810 476.1074
3ShA+1ShB+s97      448.5453 70.70435 4884 258.2291 811.9168 399.4243 449.2066 496.3832
4ShA+0ShB+s97      446.1919 64.67950 4225 274.7080 770.7598 401.2400 442.2648 487.7584

$comparison
                              difference pvalue signif.        LCL        UCL
0ShA+4ShB+s97 - 1ShA+3ShB+s97 -17.853969 0.0000     *** -22.074715 -13.633224
0ShA+4ShB+s97 - 2ShA+2ShB+s97 -28.154371 0.0000     *** -32.338627 -23.970116
0ShA+4ShB+s97 - 3ShA+1ShB+s97 -48.131777 0.0000     *** -52.245383 -44.018171
0ShA+4ShB+s97 - 4ShA+0ShB+s97 -45.778389 0.0000     *** -50.019179 -41.537600
1ShA+3ShB+s97 - 2ShA+2ShB+s97 -10.300402 0.0000     *** -14.186726  -6.414078
1ShA+3ShB+s97 - 3ShA+1ShB+s97 -30.277808 0.0000     *** -34.087962 -26.467653
1ShA+3ShB+s97 - 4ShA+0ShB+s97 -27.924420 0.0000     *** -31.871547 -23.977292
2ShA+2ShB+s97 - 3ShA+1ShB+s97 -19.977405 0.0000     *** -23.747098 -16.207713
2ShA+2ShB+s97 - 4ShA+0ShB+s97 -17.624018 0.0000     *** -21.532101 -13.715934
3ShA+1ShB+s97 - 4ShA+0ShB+s97   2.353388 0.4494          -1.478959   6.185734

$groups
NULL

attr(,"class")
[1] "group"
if ("Area" %in% VariableToAnalyze){
Model  = lm(Area.trans ~ Treatment,
              data=Data2Handle) #creating the model for Anova- defining the dependent and independent variables (Variable to analysis-Area.trans and Treatment respectively)
PWArea <- (HSD.test(Model, "Treatment", group = F)) #tukey test
PWArea}
$statistics
   MSerror    Df      Mean        CV
  1.026261 21210 -3.046036 -33.25784

$parameters
   test    name.t ntr StudentizedRange alpha
  Tukey Treatment   5         3.857987  0.05

$means
              Area.trans       std    r       Min         Max       Q25       Q50       Q75
0ShA+4ShB+s97  -3.095240 1.0055057 3291 -5.025195 -0.15848089 -3.827277 -3.068278 -2.331314
1ShA+3ShB+s97  -3.083592 1.0310570 4318 -5.025195  0.13049734 -3.864744 -3.090311 -2.331314
2ShA+2ShB+s97  -2.993781 1.0266827 4497 -5.025195 -0.03319156 -3.755123 -2.942751 -2.254696
3ShA+1ShB+s97  -3.039447 0.9862198 4884 -5.025195 -0.28612826 -3.790739 -3.004149 -2.292496
4ShA+0ShB+s97  -3.032560 1.0163072 4225 -5.025195  0.32611506 -3.790739 -3.004149 -2.292496

$comparison
                                difference pvalue signif.         LCL          UCL
0ShA+4ShB+s97 - 1ShA+3ShB+s97 -0.011647596 0.9877         -0.07559652  0.052301332
0ShA+4ShB+s97 - 2ShA+2ShB+s97 -0.101458328 0.0001     *** -0.16485440 -0.038062260
0ShA+4ShB+s97 - 3ShA+1ShB+s97 -0.055792579 0.1043         -0.11811823  0.006533076
0ShA+4ShB+s97 - 4ShA+0ShB+s97 -0.062679487 0.0599       . -0.12693210  0.001573130
1ShA+3ShB+s97 - 2ShA+2ShB+s97 -0.089810732 0.0003     *** -0.14869281 -0.030928654
1ShA+3ShB+s97 - 3ShA+1ShB+s97 -0.044144983 0.2260         -0.10187301  0.013583043
1ShA+3ShB+s97 - 4ShA+0ShB+s97 -0.051031891 0.1361         -0.11083521  0.008771424
2ShA+2ShB+s97 - 3ShA+1ShB+s97  0.045665749 0.1868         -0.01144923  0.102780730
2ShA+2ShB+s97 - 4ShA+0ShB+s97  0.038778841 0.3814         -0.02043292  0.097990602
3ShA+1ShB+s97 - 4ShA+0ShB+s97 -0.006886909 0.9976         -0.06495117  0.051177352

$groups
NULL

attr(,"class")
[1] "group"
if ("ClustersNumberPerCell" %in% VariableToAnalyze){
Model  = lm(ClustersNumberPerCell ~ Treatment,
              data=CellsDataC) #creating the model for Anova- defining the dependent and independent variables (Variable to analysis-ClustersNumberPerCell and Treatment respectively)
PWClustersNumberPerCell <- (HSD.test(Model, "Treatment", group = F)) #tukey test
PWClustersNumberPerCell}
$statistics
      MSerror  Df      Mean       CV
  0.008271292 110 0.2599713 34.98334

$parameters
   test    name.t ntr StudentizedRange alpha
  Tukey Treatment   5         3.922386  0.05

$means
              ClustersNumberPerCell        std  r        Min       Max       Q25       Q50       Q75
0ShA+4ShB+s97             0.2247688 0.05837489 23 0.13479727 0.3526948 0.1844342 0.2214116 0.2495249
1ShA+3ShB+s97             0.2433054 0.08573203 24 0.10937268 0.4316930 0.1851996 0.2285649 0.3103415
2ShA+2ShB+s97             0.2595909 0.08390007 24 0.14180561 0.4120641 0.1776014 0.2629209 0.3253100
3ShA+1ShB+s97             0.2964855 0.11610224 23 0.11165832 0.6063847 0.2008870 0.2992935 0.3734330
4ShA+0ShB+s97             0.2780164 0.10182547 21 0.09983524 0.4733694 0.2005765 0.2889477 0.3405698

$comparison
                               difference pvalue signif.         LCL         UCL
0ShA+4ShB+s97 - 1ShA+3ShB+s97 -0.01853658 0.9564         -0.09214058 0.055067413
0ShA+4ShB+s97 - 2ShA+2ShB+s97 -0.03482209 0.6843         -0.10842608 0.038781909
0ShA+4ShB+s97 - 3ShA+1ShB+s97 -0.07171665 0.0644       . -0.14609955 0.002666243
0ShA+4ShB+s97 - 4ShA+0ShB+s97 -0.05324756 0.3027         -0.12938088 0.022885757
1ShA+3ShB+s97 - 2ShA+2ShB+s97 -0.01628550 0.9716         -0.08910227 0.056531260
1ShA+3ShB+s97 - 3ShA+1ShB+s97 -0.05318007 0.2710         -0.12678407 0.020423925
1ShA+3ShB+s97 - 4ShA+0ShB+s97 -0.03471098 0.7056         -0.11008349 0.040661530
2ShA+2ShB+s97 - 3ShA+1ShB+s97 -0.03689457 0.6352         -0.11049856 0.036709430
2ShA+2ShB+s97 - 4ShA+0ShB+s97 -0.01842548 0.9608         -0.09379799 0.056947035
3ShA+1ShB+s97 - 4ShA+0ShB+s97  0.01846909 0.9619         -0.05766423 0.094602409

$groups
NULL

attr(,"class")
[1] "group"
if ("CellSurfaceExpression" %in% VariableToAnalyze){
Model  = lm(CellSurfaceExpression ~ Treatment,
              data=CellsDataC) #creating the model for Anova- defining the dependent and independent variables (Variable to analysis-CellSurfaceExpression and Treatment respectively)
PWCellSurfaceExpression <- (HSD.test(Model, "Treatment", group = F)) #tukey test
PWCellSurfaceExpression}
$statistics
    MSerror  Df     Mean       CV
  256441691 110 49133.07 32.59271

$parameters
   test    name.t ntr StudentizedRange alpha
  Tukey Treatment   5         3.922386  0.05

$means
              CellSurfaceExpression      std  r      Min       Max      Q25      Q50      Q75
0ShA+4ShB+s97              51590.10 10076.60 23 37444.09  77562.41 46943.87 50556.57 54562.10
1ShA+3ShB+s97              49019.55 11285.33 24 28552.33  81037.94 44728.19 47523.83 52665.58
2ShA+2ShB+s97              44041.60 11102.78 24 20427.47  69952.79 37584.27 42221.34 49288.98
3ShA+1ShB+s97              57416.28 28273.77 23 15125.78 121335.24 38004.18 58794.03 72606.45
4ShA+0ShB+s97              43318.50 11452.80 21 23119.77  64618.78 38922.08 44239.60 50289.20

$comparison
                               difference pvalue signif.         LCL        UCL
0ShA+4ShB+s97 - 1ShA+3ShB+s97   2570.5499 0.9817         -10389.5707 15530.6704
0ShA+4ShB+s97 - 2ShA+2ShB+s97   7548.5027 0.4908          -5411.6178 20508.6233
0ShA+4ShB+s97 - 3ShA+1ShB+s97  -5826.1727 0.7317         -18923.4412  7271.0958
0ShA+4ShB+s97 - 4ShA+0ShB+s97   8271.6046 0.4313          -5133.8771 21677.0862
1ShA+3ShB+s97 - 2ShA+2ShB+s97   4977.9529 0.8181          -7843.5528 17799.4585
1ShA+3ShB+s97 - 3ShA+1ShB+s97  -8396.7226 0.3806         -21356.8431  4563.3980
1ShA+3ShB+s97 - 4ShA+0ShB+s97   5701.0547 0.7563          -7570.4645 18972.5739
2ShA+2ShB+s97 - 3ShA+1ShB+s97 -13374.6754 0.0396       * -26334.7960  -414.5549
2ShA+2ShB+s97 - 4ShA+0ShB+s97    723.1019 0.9999         -12548.4173 13994.6210
3ShA+1ShB+s97 - 4ShA+0ShB+s97  14097.7773 0.0341       *    692.2956 27503.2590

$groups
NULL

attr(,"class")
[1] "group"
new_model=lm(FractionofChannelsinClusters ~ Treatment,
              data=CellsDataC)
PWFractionofChannelsinClusters <- HSD.test(new_model, "Treatment", group = F)
PWFractionofChannelsinClusters
$statistics
      MSerror  Df      Mean       CV
  0.002155109 110 0.1723334 26.93799

$parameters
   test    name.t ntr StudentizedRange alpha
  Tukey Treatment   5         3.922386  0.05

$means
              FractionofChannelsinClusters        std  r        Min       Max       Q25       Q50       Q75
0ShA+4ShB+s97                    0.1184674 0.03415173 23 0.06452483 0.1952345 0.1017302 0.1145079 0.1275438
1ShA+3ShB+s97                    0.1441908 0.04804622 24 0.04769675 0.2854157 0.1127500 0.1455464 0.1671480
2ShA+2ShB+s97                    0.1963731 0.04404672 24 0.13103603 0.2817908 0.1611118 0.1946739 0.2279166
3ShA+1ShB+s97                    0.1902971 0.03848746 23 0.09909048 0.2634846 0.1659696 0.1936079 0.2142701
4ShA+0ShB+s97                    0.2163439 0.06367791 21 0.13665866 0.3523840 0.1739099 0.2049573 0.2194671

$comparison
                                difference pvalue signif.         LCL          UCL
0ShA+4ShB+s97 - 1ShA+3ShB+s97 -0.025723403 0.3240         -0.06329411  0.011847301
0ShA+4ShB+s97 - 2ShA+2ShB+s97 -0.077905661 0.0000     *** -0.11547636 -0.040334957
0ShA+4ShB+s97 - 3ShA+1ShB+s97 -0.071829663 0.0000     *** -0.10979795 -0.033861375
0ShA+4ShB+s97 - 4ShA+0ShB+s97 -0.097876438 0.0000     *** -0.13673822 -0.059014656
1ShA+3ShB+s97 - 2ShA+2ShB+s97 -0.052182258 0.0016      ** -0.08935112 -0.015013391
1ShA+3ShB+s97 - 3ShA+1ShB+s97 -0.046106260 0.0081      ** -0.08367696 -0.008535556
1ShA+3ShB+s97 - 4ShA+0ShB+s97 -0.072153035 0.0000     *** -0.11062647 -0.033679603
2ShA+2ShB+s97 - 3ShA+1ShB+s97  0.006075998 0.9915         -0.03149471  0.043646702
2ShA+2ShB+s97 - 4ShA+0ShB+s97 -0.019970778 0.6035         -0.05844421  0.018502655
3ShA+1ShB+s97 - 4ShA+0ShB+s97 -0.026046775 0.3457         -0.06490856  0.012815007

$groups
NULL

attr(,"class")
[1] "group"

new try

library(agricolae)
#in all those commands a tukey multiple comparsion test is carried out
if ("Density" %in% VariableToAnalyze){
model  = lm(Density.trans ~ Treatment,
              data=Data2Handle) #creating the model for Anova- defining the dependent and independent variables (Variable to analysis-Density.trans and Treatment respectively)
PWDensity <- (HSD.test(model, "Treatment", group = T)) #tukey test
PWDensity}
$statistics
   MSerror    Df     Mean       CV
  4470.641 21210 430.2129 15.54181

$parameters
   test    name.t ntr StudentizedRange alpha
  Tukey Treatment   5         3.857987  0.05

$means
              Density.trans      std    r      Min      Max      Q25      Q50      Q75
0ShA+4ShB+s97      400.4135 68.73403 3291 244.1150 665.8430 348.1639 394.4883 445.6004
1ShA+3ShB+s97      418.2675 63.04118 4318 234.1932 717.2235 374.9122 414.7732 459.1624
2ShA+2ShB+s97      428.5679 66.76477 4497 251.5226 694.1119 379.4243 427.1810 476.1074
3ShA+1ShB+s97      448.5453 70.70435 4884 258.2291 811.9168 399.4243 449.2066 496.3832
4ShA+0ShB+s97      446.1919 64.67950 4225 274.7080 770.7598 401.2400 442.2648 487.7584

$comparison
NULL

$groups
              Density.trans groups
3ShA+1ShB+s97      448.5453      a
4ShA+0ShB+s97      446.1919      a
2ShA+2ShB+s97      428.5679      b
1ShA+3ShB+s97      418.2675      c
0ShA+4ShB+s97      400.4135      d

attr(,"class")
[1] "group"
if ("Area" %in% VariableToAnalyze){
Model  = lm(Area.trans ~ Treatment,
              data=Data2Handle) #creating the model for Anova- defining the dependent and independent variables (Variable to analysis-Area.trans and Treatment respectively)
PWArea <- (HSD.test(Model, "Treatment", group = T)) #tukey test
PWArea}
$statistics
   MSerror    Df      Mean        CV
  1.026261 21210 -3.046036 -33.25784

$parameters
   test    name.t ntr StudentizedRange alpha
  Tukey Treatment   5         3.857987  0.05

$means
              Area.trans       std    r       Min         Max       Q25       Q50       Q75
0ShA+4ShB+s97  -3.095240 1.0055057 3291 -5.025195 -0.15848089 -3.827277 -3.068278 -2.331314
1ShA+3ShB+s97  -3.083592 1.0310570 4318 -5.025195  0.13049734 -3.864744 -3.090311 -2.331314
2ShA+2ShB+s97  -2.993781 1.0266827 4497 -5.025195 -0.03319156 -3.755123 -2.942751 -2.254696
3ShA+1ShB+s97  -3.039447 0.9862198 4884 -5.025195 -0.28612826 -3.790739 -3.004149 -2.292496
4ShA+0ShB+s97  -3.032560 1.0163072 4225 -5.025195  0.32611506 -3.790739 -3.004149 -2.292496

$comparison
NULL

$groups
              Area.trans groups
2ShA+2ShB+s97  -2.993781      a
4ShA+0ShB+s97  -3.032560     ab
3ShA+1ShB+s97  -3.039447     ab
1ShA+3ShB+s97  -3.083592      b
0ShA+4ShB+s97  -3.095240      b

attr(,"class")
[1] "group"
if ("ClustersNumberPerCell" %in% VariableToAnalyze){
Model  = lm(ClustersNumberPerCell ~ Treatment,
              data=CellsDataC) #creating the model for Anova- defining the dependent and independent variables (Variable to analysis-ClustersNumberPerCell and Treatment respectively)
PWClustersNumberPerCell <- (HSD.test(Model, "Treatment", group = T)) #tukey test
PWClustersNumberPerCell}
$statistics
      MSerror  Df      Mean       CV
  0.008271292 110 0.2599713 34.98334

$parameters
   test    name.t ntr StudentizedRange alpha
  Tukey Treatment   5         3.922386  0.05

$means
              ClustersNumberPerCell        std  r        Min       Max       Q25       Q50       Q75
0ShA+4ShB+s97             0.2247688 0.05837489 23 0.13479727 0.3526948 0.1844342 0.2214116 0.2495249
1ShA+3ShB+s97             0.2433054 0.08573203 24 0.10937268 0.4316930 0.1851996 0.2285649 0.3103415
2ShA+2ShB+s97             0.2595909 0.08390007 24 0.14180561 0.4120641 0.1776014 0.2629209 0.3253100
3ShA+1ShB+s97             0.2964855 0.11610224 23 0.11165832 0.6063847 0.2008870 0.2992935 0.3734330
4ShA+0ShB+s97             0.2780164 0.10182547 21 0.09983524 0.4733694 0.2005765 0.2889477 0.3405698

$comparison
NULL

$groups
              ClustersNumberPerCell groups
3ShA+1ShB+s97             0.2964855      a
4ShA+0ShB+s97             0.2780164      a
2ShA+2ShB+s97             0.2595909      a
1ShA+3ShB+s97             0.2433054      a
0ShA+4ShB+s97             0.2247688      a

attr(,"class")
[1] "group"
if ("CellSurfaceExpression" %in% VariableToAnalyze){
Model  = lm(CellSurfaceExpression ~ Treatment,
              data=CellsDataC) #creating the model for Anova- defining the dependent and independent variables (Variable to analysis-CellSurfaceExpression and Treatment respectively)
PWCellSurfaceExpression <- (HSD.test(Model, "Treatment", group = T)) #tukey test
PWCellSurfaceExpression}
$statistics
    MSerror  Df     Mean       CV
  256441691 110 49133.07 32.59271

$parameters
   test    name.t ntr StudentizedRange alpha
  Tukey Treatment   5         3.922386  0.05

$means
              CellSurfaceExpression      std  r      Min       Max      Q25      Q50      Q75
0ShA+4ShB+s97              51590.10 10076.60 23 37444.09  77562.41 46943.87 50556.57 54562.10
1ShA+3ShB+s97              49019.55 11285.33 24 28552.33  81037.94 44728.19 47523.83 52665.58
2ShA+2ShB+s97              44041.60 11102.78 24 20427.47  69952.79 37584.27 42221.34 49288.98
3ShA+1ShB+s97              57416.28 28273.77 23 15125.78 121335.24 38004.18 58794.03 72606.45
4ShA+0ShB+s97              43318.50 11452.80 21 23119.77  64618.78 38922.08 44239.60 50289.20

$comparison
NULL

$groups
              CellSurfaceExpression groups
3ShA+1ShB+s97              57416.28      a
0ShA+4ShB+s97              51590.10     ab
1ShA+3ShB+s97              49019.55     ab
2ShA+2ShB+s97              44041.60      b
4ShA+0ShB+s97              43318.50      b

attr(,"class")
[1] "group"
new_model=lm(FractionofChannelsinClusters ~ Treatment,
              data=CellsDataC)
PWFractionofChannelsinClusters <- HSD.test(new_model, "Treatment", group = T)
PWFractionofChannelsinClusters
$statistics
      MSerror  Df      Mean       CV
  0.002155109 110 0.1723334 26.93799

$parameters
   test    name.t ntr StudentizedRange alpha
  Tukey Treatment   5         3.922386  0.05

$means
              FractionofChannelsinClusters        std  r        Min       Max       Q25       Q50       Q75
0ShA+4ShB+s97                    0.1184674 0.03415173 23 0.06452483 0.1952345 0.1017302 0.1145079 0.1275438
1ShA+3ShB+s97                    0.1441908 0.04804622 24 0.04769675 0.2854157 0.1127500 0.1455464 0.1671480
2ShA+2ShB+s97                    0.1963731 0.04404672 24 0.13103603 0.2817908 0.1611118 0.1946739 0.2279166
3ShA+1ShB+s97                    0.1902971 0.03848746 23 0.09909048 0.2634846 0.1659696 0.1936079 0.2142701
4ShA+0ShB+s97                    0.2163439 0.06367791 21 0.13665866 0.3523840 0.1739099 0.2049573 0.2194671

$comparison
NULL

$groups
              FractionofChannelsinClusters groups
4ShA+0ShB+s97                    0.2163439      a
2ShA+2ShB+s97                    0.1963731      a
3ShA+1ShB+s97                    0.1902971      a
1ShA+3ShB+s97                    0.1441908      b
0ShA+4ShB+s97                    0.1184674      b

attr(,"class")
[1] "group"

Summerizing the data for the variable CellSurfaceExpression, calculation the standard error for a bar plot with se. the sammerized data will be used to create bar plot with standard error shown in the bars. the summerized data will be saved in a diiferent path as a csv file

if ("CellSurfaceExpression" %in% VariableToAnalyze){ #if the user wants to analyze this variable
Data1 = summarySE(data=CellsDataC,
             "CellSurfaceExpression",
             groupvars="Treatment",
             conf.interval = 0.95) #creatingg a new summery dataframe gor plotting purposes
datai <- as.data.frame(PWCellSurfaceExpression$groups) # changing the tukey result for this variable into a dataframe- in order to extract the group from it, whitch shows wether two levels within the tested variable differ significatly
datai$Treatment <- row.names(PWCellSurfaceExpression$groups) #adding a column for treatment datai, for the next step
Data1 <- merge(Data1,datai[,-1], by="Treatment")# assigning this into the summery data
offset.v = -3 # offsets for mean letters 
offset.h = 0.8
plot_1 <- ggplot(Data1,
            aes(x = Treatment, y = CellSurfaceExpression,
                ymax=2.0, ymin=0.0))  +
            geom_bar(stat="identity", fill="dark green",
colour = "dark green", width = 0.7) + geom_errorbar(aes(ymax=CellSurfaceExpression+se, ymin=CellSurfaceExpression-se),
width=0.2, size=0.5, color="black") + geom_text(aes(label=groups,
                      hjust=0.8, vjust=-4)) +
            labs(x = "Different ratio of Both Variants ShA and ShB",
                 y = "Mean CellSurfaceExpression-Clusters/Area size(um^2)")  +
             ggtitle("Normalized Mean CellSurfaceExpression in different ShB/ShA ratios") +
            theme_bw()  +
            theme(plot.title = element_text(size = rel(1.2),
                  face = "bold", vjust = 1.5),
                  axis.title = element_text(face = "bold"),
                  axis.title.y = element_text(vjust= 1.8),
                  axis.title.x = element_text(vjust= -0.5),
                  axis.text.x=element_text( size=7),
                  panel.border = element_rect(colour="black"),
                  panel.grid.major = element_blank(), 
                  panel.grid.minor = element_blank(),
                  panel.background = element_blank(), 
                  axis.line = element_line(colour = "black"))
print(plot_1+  annotate("text", label = "", y = 1.9,x=5, size = 3)) #setting the plot as needed
write.csv(Data1,"CellSurfaceExpressionSummery.csv", row.names = TRUE)
}

Summerizing the data for the variable CellSurfaceExpression, calculation the standard error for a bar plot with se. the sammerized data will be used to create bar plot with standard error shown in the bars . the summerized data will be saved in a diiferent path as a csv file

if ("ClustersNumberPerCell" %in% VariableToAnalyze){ #if the user choose to analyze this variable, result shows
Data2 = summarySE(data=CellsDataC,
             "ClustersNumberPerCell",
             groupvars="Treatment",
             conf.interval = 0.95)#creatingg a new summery dataframe gor plotting purposes
datai <- as.data.frame.list(PWClustersNumberPerCell$groups)# changing the tukey result for this variable into a dataframe- in order to extract the group from it, whitch shows wether two levels within the tested variable differ significatly
datai$Treatment <- row.names(PWClustersNumberPerCell$groups)#adding a column for treatmet datai, for the next step
Data2 <- merge(Data2,datai[,-1], by="Treatment")# assigning this into the summery data
offset.v = -3 # offsets for mean letters 
offset.h = 0.8
plot_2 <- ggplot(Data2,
            aes(x = Treatment, y = ClustersNumberPerCell,
                ymax=1.0, ymin=0.0))  +
            geom_bar(stat="identity", fill="black",
colour = "black", width = 0.7) + geom_errorbar(aes(ymax=ClustersNumberPerCell+se, ymin=ClustersNumberPerCell-se),
width=0.2, size=0.5, color="black") + geom_text(aes(label=groups,
                      hjust=1.4, vjust=-3)) +
            labs(x = "Different ratio of Both Variants ShA and ShB",
                 y = "Mean ClustersNumberPerCell Per cell")  +
             ggtitle("Normalized Mean ClustersNumberPerCell in different ShB/ShA ratios") +
            theme_bw()  +
            theme(plot.title = element_text(size = rel(1.2),
                  face = "bold", vjust = 1.5),
                  axis.title = element_text(face = "bold"),
                  axis.title.y = element_text(vjust= 1.8),
                  axis.title.x = element_text(vjust= -0.5),
                  axis.text.x=element_text( size=7),
                  panel.border = element_rect(colour="black"),
                  panel.grid.major = element_blank(), 
                  panel.grid.minor = element_blank(),
                  panel.background = element_blank(), 
                  axis.line = element_line(colour = "black"))
print(plot_2+  annotate("text", label = "", y =0.7,x=5, size = 3))
write.csv(Data2,"ClustersNumberPerCellSummery.csv", row.names = TRUE)}

Summerizing the data for the variable CellSurfaceExpression, calculation the standard error for a bar plot with se. the sammerized data will be used to create bar plot with standard error shown in the bars and also will be used for creating a boxplot for this variable. “Density” The summerized data will be saved in a diiferent path as a csv file.

if ("Density" %in%VariableToAnalyze){ #if the user wants to analyze this variable, the results show
Data3 = summarySE(data=Data2Handle,
             "Density",
             groupvars="Treatment",
             conf.interval = 0.95)#creatingg a new summery dataframe gor plotting purposes
datai <- as.data.frame.list(PWDensity$groups)# changing the tukey result for this variable into a dataframe- in order to extract the group from it, whitch shows wether two levels within the tested variable differ significatly
datai$Treatment <- row.names(PWDensity$groups)#adding a column for treatmet datai, for the next step
Data3 <- merge(Data3,datai[,-1], by="Treatment")# assigning this into the summery data
offset.v = -3 # offsets for mean letters 
offset.h = 0.8
plot_3 <- ggplot(Data3,
            aes(x = Treatment, y = Density,
                ymax=2.0, ymin=0.0))  +
            geom_bar(stat="identity", fill= "dark blue",
colour = "blue", width = 0.7) + geom_errorbar(aes(ymax=Density+se, ymin=Density-se),
width=0.2, size=0.5, color="black") + geom_text(aes(label=groups,
                      hjust=1, vjust=-1)) +
            labs(x = "Different ratio of Both Variants ShA and ShB",
                 y = "Mean of Clusters Density (A.U/cluster area size(um^2))")  +
             ggtitle("Mean of Clusters Density in different ShB/ShA ratios") +
            theme_bw()  +
            theme(plot.title = element_text(size = rel(1.2),
                  face = "bold", vjust = 1.5),
                  axis.title = element_text(face = "bold"),
                  axis.title.y = element_text(vjust= 1.8),
                  axis.title.x = element_text(vjust= -0.5),
                  axis.text.x=element_text( size=7),
                  panel.border = element_rect(colour="black"),
                  panel.grid.major = element_blank(), 
                  panel.grid.minor = element_blank(),
                  panel.background = element_blank(), 
                  axis.line = element_line(colour = "black"))
print(plot_3+  annotate("text", label = "", y = 300000,x=5, size = 3))
write.csv(Data3,"DensitySummery.csv", row.names = TRUE)}

Summerizing the data for the variable CellSurfaceExpression, calculation the standard error for a bar plot with se. the sammerized data will be used to create bar plot with standard error shown in the bars and also will be used for creating a boxplot for this variable. “Area” the summerized data will be saved in a diiferent path as a csv file

if ("Area" %in% VariableToAnalyze){ #if the user wants to analyze this variable, the results show
Data4 = summarySE(data=Data2Handle,
             "Area",
             groupvars="Treatment",
             conf.interval = 0.95)#creatingg a new summery dataframe gor plotting purposes
datai <- as.data.frame.list(PWArea$groups)# changing the tukey result for this variable into a dataframe- in order to extract the group from it, whitch shows wether two levels within the tested variable differ significatly
datai$Treatment <- row.names(PWArea$groups)#adding a column for treatmet datai, for the next step
Data4 <- merge(Data4,datai[,-1], by="Treatment")# assigning this into the summery data
offset.v = -3 # offsets for mean letters 
offset.h = 0.8 # offsets for mean letters
plot_4 <- ggplot(Data4,
            aes(x = Treatment, y = Area,
                ymax=0.11, ymin=0.0))  +
            geom_bar(stat="identity", fill="gray",
colour = "black", width = 0.7) + geom_errorbar(aes(ymax=Area+se, ymin=Area-se),
width=0.2, size=0.5, color="black") + geom_text(aes(label=groups,
                      hjust=0.5, vjust=-1.5)) + 
            labs(x = "Different ratio of Both Variants ShA and ShB",
                 y = "Mean of Clusters Area size(um^2)")  +
             ggtitle("Mean of Clusters Area Size in different ShB/ShA ratios") +
            theme_bw()  +
            theme(plot.title = element_text(size = rel(1.2),
                  face = "bold", vjust = 1.5),
                  axis.title = element_text(face = "bold"),
                  axis.title.y = element_text(vjust= 1.8),
                  axis.title.x = element_text(vjust= -0.5),
                  axis.text.x=element_text( size=7),
                  panel.border = element_rect(colour="black"),
                  panel.grid.major = element_blank(), 
                  panel.grid.minor = element_blank(),
                  panel.background = element_blank(), 
                  axis.line = element_line(colour = "black"))
print(plot_4+  annotate("text", label = "", y = 0.19,x=5, size = 3))
write.csv(Data4,"AreaSummery.csv", row.names = TRUE)}

Histograms plot for all treatment to see the relative frequency and the distribution of each treatment relativly to others- this is done in the same plot- Both variables are shown in those histograms “Density” and “Area”-VariableToAnalyze

if ("Density" %in% VariableToAnalyze){ #if the user wants to analyze this variable, the results show
hist_allDensity <- ggplot(Data2Handle, aes(Density/100000, ymax=1.0, ymin=0.0)) +
  facet_wrap(~Treatment, scales = 'free_x') +
  geom_histogram(aes(y = stat(count) / sum(count),color = Treatment, fill = Treatment))+  
            theme(legend.position="none", plot.title = element_text(size = rel(1.2),
                  face = "bold", vjust = 1.5, hjust = 0.5),
                  axis.title = element_text(face = "bold"),
                  axis.title.y = element_text(vjust= 1.8),
                  axis.title.x = element_text(vjust= -0.5),
                  axis.text.x=element_text( size=7),
                  panel.grid.major = element_blank(), 
                  panel.background = element_blank(),
                  plot.caption = element_text(hjust = 0.5),
                  axis.line = element_line(colour = "black"))+
            labs(x = "Density-Integrated Intinsity*10^5 ((A.U)/cluster area size(um^2))",
                 y = "Relative frequency")  +
             ggtitle("Relative frequency of Clusters Density")
hist_allDensity}

if ("Area" %in% VariableToAnalyze){ #if the user wants to analyze this variable, the results show
hist_allArea <- ggplot(Data2Handle, aes(Area, ymax=1.0, ymin=0.0)) +
  facet_wrap(~Treatment, scales = 'free_x') +
  geom_histogram(aes(y = stat(count) / sum(count),color = Treatment, fill = Treatment))+  
            theme(legend.position="none", plot.title = element_text(size = rel(1.2),
                  face = "bold", vjust = 1.5, hjust = 0.5),
                  axis.title = element_text(face = "bold"),
                  axis.title.y = element_text(vjust= 1.8),
                  axis.title.x = element_text(vjust= -0.5),
                  axis.text.x=element_text( size=7),
                  panel.grid.major = element_blank(), 
                  panel.background = element_blank(),
                  plot.caption = element_text(hjust = 0.5),
                  axis.line = element_line(colour = "black"))+
            labs(x = "Mean of Clusters Area size(um^2)",
                 y = "Relative frequency")  +
             ggtitle("Relative frequency of Clusters Area Size Mean(um^2)") 
hist_allArea}

just in case- another plot to see the variables

last plots are shown, boxplot, while the x-axis this time is shown as a numeric (Ratio of both variants shown as ShB/ShA).That is to see if there is a tendency/correlation between the transfiction ratio and the Density/Area)

if ("Density" %in% VariableToAnalyze){ #if the user wants to analyze this variable, the results show
df5 <- Data3 %>%
  add_column(.after=7,ratio = NA)%>%
  mutate(ratio= ifelse( Treatment =="4ShA+0ShB+s97",1,
                            ifelse(Treatment=="0ShA+4ShB+s97", 0,
                                   ifelse(Treatment=="2ShA+2ShB+s97",1/2,
                                          ifelse(Treatment=="1ShA+3ShB+s97",1/4,
                                                 ifelse(Treatment=='3ShA+1ShB+s97',3/4,ratio))))))
# for the summery data of Density: a new column is added, a new presentation of the treatment as a ratio of the both variants
boxDen <- ggplot(df5, aes(x = ratio,fill = ratio)) +
  geom_boxplot(aes(group = ratio,
      lower = Density - se, 
      upper = Density + se, 
      middle = Density, 
      ymin = Density - 3*se, 
      ymax = Density + 3*se),
    stat = "identity") +
            labs(x = "Different ratio of Both Variants ShA and ShB (ShB/ShA)",
                 y = "Mean of Clusters Density (A.U/cluster area size(um^2))")  +
             ggtitle("Mean of Clusters Density as a function of ShB/ShA ratio")+ theme(legend.position="right")
boxDen
}

if ("Area" %in% VariableToAnalyze){ #if the user wants to analyze this variable, the results show
df6 <- Data4 %>%
  add_column(.after=7,ratio = NA)%>%
  mutate(ratio= ifelse( Treatment =="4ShA+0ShB+s97",1,
                            ifelse(Treatment=="0ShA+4ShB+s97", 0,
                                   ifelse(Treatment=="2ShA+2ShB+s97",1/2,
                                          ifelse(Treatment=="1ShA+3ShB+s97",1/4,
                                                 ifelse(Treatment=='3ShA+1ShB+s97',3/4,ratio))))))
# for the summery data of Area: a new column is added, a new presentation of the treatment as a ratio of the both variants
#Plotting a boxplot of Area variable whereas the x-axis this time is a numeric variable, with the standard error shown
boxArea <- ggplot(df6, aes(x = ratio,fill = ratio)) +
  geom_boxplot(aes(group = ratio,
      lower = Area - se, 
      upper = Area + se, 
      middle = Area, 
      ymin = Area - 3*se, 
      ymax = Area + 3*se),
    stat = "identity") +
            labs(x = "Different Ratio of Both Variants ShA and ShB (ShB/ShA)",
                 y = "Mean of Cluster Area Size(um^2))")  +
             ggtitle("Mean of Cluster Area Size in Different Ratios of ShB/ShA variants") + theme(legend.position="right")
boxArea }

Density files

write.xlsx(Data2Handle[Data2Handle$Treatment=="4ShA+0ShB+s97",]$Area,"Area_4ShA+0ShB+s97_sum.xlsx")
write.xlsx(Data2Handle[Data2Handle$Treatment=="3ShA+1ShB+s97",]$Area,"Area_3ShA+1ShB+s97_sum.xlsx")
write.xlsx(Data2Handle[Data2Handle$Treatment=="2ShA+2ShB+s97",]$Area,"Area_2ShA+2ShB+s97_sum.xlsx")
write.xlsx(Data2Handle[Data2Handle$Treatment=="1ShA+3ShB+s97",]$Area,"Area_1ShA+3ShB+s97_sum.xlsx")
write.xlsx(Data2Handle[Data2Handle$Treatment=="0ShA+4ShB+s97",]$Area,"Area_0ShA+4ShB+s97_sum.xlsx")

write.xlsx(Data2Handle[Data2Handle$Treatment=="4ShA+0ShB+s97",]$Density,"Density_4ShA+0ShB+s97_sum.xlsx")
write.xlsx(Data2Handle[Data2Handle$Treatment=="3ShA+1ShB+s97",]$Density,"Density_3ShA+1ShB+s97_sum.xlsx")
write.xlsx(Data2Handle[Data2Handle$Treatment=="2ShA+2ShB+s97",]$Density,"Density_2ShA+2ShB+s97_sum.xlsx")
write.xlsx(Data2Handle[Data2Handle$Treatment=="1ShA+3ShB+s97",]$Density,"Density_1ShA+3ShB+s97_sum.xlsx")
write.xlsx(Data2Handle[Data2Handle$Treatment=="0ShA+4ShB+s97",]$Density,"Density_0ShA+4ShB+s97_sum.xlsx")


write.xlsx(CellsDataC[CellsDataC$Treatment=="0ShA+4ShB+s97",]$FractionofChannelsinClusters,"FractionofChannelsinClusters_0ShA+4ShB+s97_sum.xlsx")
write.xlsx(CellsDataC[CellsDataC$Treatment=="1ShA+3ShB+s97",]$FractionofChannelsinClusters,"FractionofChannelsinClusters_1ShA+3ShB+s97_sum.xlsx")
write.xlsx(CellsDataC[CellsDataC$Treatment=="2ShA+2ShB+s97",]$FractionofChannelsinClusters,"FractionofChannelsinClusters_2ShA+2ShB+s97_sum.xlsx")
write.xlsx(CellsDataC[CellsDataC$Treatment=="3ShA+1ShB+s97",]$FractionofChannelsinClusters,"FractionofChannelsinClusters_3ShA+1ShB+s97_sum.xlsx")
write.xlsx(CellsDataC[CellsDataC$Treatment=="4ShA+0ShB+s97",]$FractionofChannelsinClusters,"FractionofChannelsinClusters_4ShA+0ShB+s97_sum.xlsx")




write.xlsx(CellsDataC[CellsDataC$Treatment=="0ShA+4ShB+s97",]$CellSurfaceExpression,"CellSurfaceExpression_0ShA+4ShB+s97_sum.xlsx")
write.xlsx(CellsDataC[CellsDataC$Treatment=="1ShA+3ShB+s97",]$CellSurfaceExpression,"CellSurfaceExpression_1ShA+3ShB+s97_sum.xlsx")
write.xlsx(CellsDataC[CellsDataC$Treatment=="2ShA+2ShB+s97",]$CellSurfaceExpression,"CellSurfaceExpression_2ShA+2ShB+s97_sum.xlsx")
write.xlsx(CellsDataC[CellsDataC$Treatment=="3ShA+1ShB+s97",]$CellSurfaceExpression,"CellSurfaceExpression_3ShA+1ShB+s97_sum.xlsx")
write.xlsx(CellsDataC[CellsDataC$Treatment=="4ShA+0ShB+s97",]$CellSurfaceExpression,"CellSurfaceExpression_4ShA+0ShB+s97_sum.xlsx")


Data9 = summarySE(data=CellsDataC,
             "FractionofChannelsinClusters",
             groupvars="Treatment",
             conf.interval = 0.95)#creatingg a new summery dataframe gor plotting purposes
datai <- as.data.frame.list(PWFractionofChannelsinClusters$groups)# changing the tukey result for this variable into a dataframe- in order to extract the group from it, whitch shows wether two levels within the tested variable differ significatly
datai$Treatment <- row.names(PWFractionofChannelsinClusters$groups)#adding a column for treatmet datai, for the next step
Data9 <- merge(Data9,datai[,-1], by="Treatment")
write.csv(Data9,"FractionofChannelsinClusters.csv", row.names = TRUE)

A simple linear regression will be performed in this chunk, testing for whether the expected values of the treatment predicts successfully the experimental observed means in each treatment. creating new summarized data if the variables Area/Density had been transformed

if ("Density" %in% VariableToAnalyze){ #if the user wants to analyze this variable, the results show
  if ("Density.trans" %in% colnames(Data2Handle)){ #if the data for variable Density had been transformed, there is a a need to create a new summarized data frame with the transformed values- since linear regression assume normality and homogenty of variances
  Data5 = summarySE(data=Data2Handle,
             "Density.trans",
             groupvars="Treatment",
             conf.interval = 0.95) #creatingg a new summery dataframe gor plotting purposes
datai <- as.data.frame.list(PWDensity$groups)# changing the tukey result for this variable into a dataframe- in order to extract the group from it, whitch shows wether two levels within the tested variable differ significatly
datai$Treatment <- row.names(PWDensity$groups)#adding a column for treatmet datai, for the next step
Data5 <- merge(Data5,datai[,-1], by="Treatment")# assigning this into the summery data
names(Data5)[names(Data5) == "Density.trans"] <- "Density" #changing the name of the column, so the rest if thhe code could recognize both if the conditions- transformed/not transformed data
df5 <- Data5 %>%
  add_column(.after=7,ratio = NA)%>%
  mutate(ratio= ifelse( Treatment =="4ShA+0ShB+s97",1,
                            ifelse(Treatment=="0ShA+4ShB+s97", 0,
                                   ifelse(Treatment=="2ShA+2ShB+s97",1/2,
                                          ifelse(Treatment=="1ShA+3ShB+s97",1/4,
                                                 ifelse(Treatment=='3ShA+1ShB+s97',3/4,ratio)))))) #adding the ratio as number according to the name of the treatment in a new column.
}
equation1expD <- df5$ratio * df5$Density[5] + (1-df5$ratio)* df5$Density[1] #calculating the expected values for each treatment for the Density 
df5$equation1expD <- equation1expD # inserting these expected values to df5
modelD <- lm(Density~equation1expD, data=df5) #performing linear regression to check whether the expected values predict the response-the experimental data.
print(summary(modelD)) #showing the results
print(summ(modelD)) #showing the results in another way
effect_plot(modelD, pred = equation1expD, interval = TRUE, plot.points = TRUE) #presenting the result in a graphical way
}

Call:
lm(formula = Density ~ equation1expD, data = df5)

Residuals:
      1       2       3       4       5 
-3.6168  2.0537  0.1707  7.9646 -6.5722 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)   
(Intercept)   -22.2338    75.2391  -0.296   0.7869   
equation1expD   1.0646     0.1776   5.994   0.0093 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 6.428 on 3 degrees of freedom
Multiple R-squared:  0.9229,    Adjusted R-squared:  0.8972 
F-statistic: 35.92 on 1 and 3 DF,  p-value: 0.0093

MODEL INFO:
Observations: 5
Dependent Variable: Density
Type: OLS linear regression 

MODEL FIT:
F(1,3) = 35.92, p = 0.01
R² = 0.92
Adj. R² = 0.90 

Standard errors: OLS
----------------------------------------------------
                        Est.    S.E.   t val.      p
------------------- -------- ------- -------- ------
(Intercept)           -22.23   75.24    -0.30   0.79
equation1expD           1.06    0.18     5.99   0.01
----------------------------------------------------

if ("Area" %in% VariableToAnalyze){ #if the user wants to analyze this variable, the results show
  if ("Area.trans" %in% colnames(Data2Handle)){ #if the data for variable Area had been transformed, there is a a need to create a new summarized data frame with the transformed values- since linear regression assume normality and homogeneity of variances
  Data6 = summarySE(data=Data2Handle,
             "Area.trans",
             groupvars="Treatment",
             conf.interval = 0.95) #creatingg a new summery dataframe gor plotting purposes
datai <- as.data.frame.list(PWDensity$groups) # changing the tukey result for this variable into a dataframe- in order to extract the group from it, whitch shows wether two levels within the tested variable differ significatly
datai$Treatment <- row.names(PWDensity$groups)#adding a column for treatmet datai, for the next step
Data6 <- merge(Data6,datai[,-1], by="Treatment")# assigning this into the summery data
names(Data6)[names(Data6) == "Area.trans"] <- "Area" #changing the name of the column, so the rest if thhe code could recognize both if the conditions- transformed/not transformed data
df6 <- Data6 %>%
  add_column(.after=7,ratio = NA)%>%
  mutate(ratio= ifelse( Treatment =="4ShA+0ShB+s97",1,
                            ifelse(Treatment=="0ShA+4ShB+s97", 0,
                                   ifelse(Treatment=="2ShA+2ShB+s97",1/2,
                                          ifelse(Treatment=="1ShA+3ShB+s97",1/4,
                                                 ifelse(Treatment=='3ShA+1ShB+s97',3/4,ratio)))))) #adding the ratio as number according to the name of the treatment in a new column.
}
  equation1expA <- df6$ratio * df6$Area[5]  + (1-df6$ratio)* df6$Area[1] #calculating the expected values for each treatment for the Area
df6$equation1expA <- equation1expA # inserting these expected values to df6
modelA <- lm(Area~equation1expA, data=df6) #performing linear regression to check whether the expected values predict the response-the experimental data.
print(summary(modelA)) #showing the results
print(summ(modelA))#showing the results in another way
effect_plot(modelA, pred = equation1expA, interval = TRUE, plot.points = TRUE) #presenting the result in a graphical way
}

Call:
lm(formula = Area ~ equation1expA, data = df6)

Residuals:
        1         2         3         4         5 
-0.012415 -0.017718  0.055143 -0.007473 -0.017537 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)
(Intercept)     0.2654     2.2214   0.119    0.912
equation1expA   1.0817     0.7250   1.492    0.233

Residual standard error: 0.03593 on 3 degrees of freedom
Multiple R-squared:  0.4259,    Adjusted R-squared:  0.2346 
F-statistic: 2.226 on 1 and 3 DF,  p-value: 0.2325

MODEL INFO:
Observations: 5
Dependent Variable: Area
Type: OLS linear regression 

MODEL FIT:
F(1,3) = 2.23, p = 0.23
R² = 0.43
Adj. R² = 0.23 

Standard errors: OLS
-------------------------------------------------
                      Est.   S.E.   t val.      p
------------------- ------ ------ -------- ------
(Intercept)           0.27   2.22     0.12   0.91
equation1expA         1.08   0.73     1.49   0.23
-------------------------------------------------

new



hist_allDensity_p <- ggplot(Data2Handle, aes(Density/1000000, ymax=1.0, ymin=0.0)) +
  facet_wrap(~Treatment, scales = 'free_x') +
  geom_histogram(aes(y = stat(count) / sum(count),color = CellNumber, fill = CellNumber))+  
            theme(legend.position="none", plot.title = element_text(size = rel(1.2),
                  face = "bold", vjust = 1.5, hjust = 0.5),
                  axis.title = element_text(face = "bold"),
                  axis.title.y = element_text(vjust= 1.8),
                  axis.title.x = element_text(vjust= -0.5),
                  axis.text.x=element_text( size=7),
                  panel.grid.major = element_blank(), 
                  panel.background = element_blank(),
                  plot.caption = element_text(hjust = 0.5),
                  axis.line = element_line(colour = "black"))+
            labs(x = "Density-Integrated Intinsity*10^6 ((A.U)/cluster area size(um^2))",
                 y = "Relative frequency")  +
             ggtitle("Relative frequency of Clusters Density")
hist_allDensity_p

Here the project ends :)

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKSW50b2R1Y3Rpb246IEhhbmRsaW5nIHRoZSBmaWxlczogcmVhZGluZyBtdWx0aXBsZSBjc3YgZmlsZXMgaW50byB0aGUgc2FtZSBkYXRhZnJhbWUtY2FsbGVkIFJhd0RhdGEuCkRhdGEgd2lsbCBiZSBvcmdhbml6ZWQgaW50byBhIHNwZWNpZmljIHRlbXBsYXRlLCBzb21lIHJhd3Mgd2l0aGluIHRoZSBSYXdEYXRhIHdpbGwgYmUgZXh0cmFjdGVkIGludG8gYSBuZXcgZGF0YWZyYW1lIC0gVGhvc2Ugd2lsbCBiZSB0aGUgZGF0YSByZWdhcmRpbmcgdGhlIHdob2xlIGNlbGxzLgpUaGlzIHNtYWxsIGRhdGFmcmFtZSB3aWxsIGJlIG9yZ2FuaXplZCwgc29tZSBkYXRhIHdpbGwgYmUgbm9ybWFsaXplZCBhbmQgc29tZSB3aWxsIGJlIGFkZGVkLWRhdGFmcmFtZSBpcyBjYWxsZWQgQ2VsbHNEYXRhQy4KVGhlIHJlc3QsIGFzIHdlbGwsIHdpbGwgYmUgYXNzaWduZWQgaW50byBhIG5ldyBkYXRhZnJhbWUtIGNhbGxlZCBEYXRhMkhhbmRsZTogdGhpcyBkYXRhIHdpbGwgYmUgY2xlYW5lZCwgcmVvcmdhbml6ZWQgYW5kIHNvbWUgcm93cyB3aWxsIGJlIGVsaW1pbmF0ZWQtZHVlIHRvIHJlc29sdXRpb24gaXNzdWVzLgoKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeSh0aWJibGUpCmxpYnJhcnkoc3RyaW5ncikKbGlicmFyeShyZXNoYXBlMikKbGlicmFyeShybGlzdCkKbGlicmFyeShyZWFkcikKbGlicmFyeShwdXJycikKbGlicmFyeShkZ29mKQpsaWJyYXJ5KGNhcikKbGlicmFyeShSbWlzYykKI2xpYnJhcnkoYWdyaWNvbGFlKQpsaWJyYXJ5KGp0b29scykKbGlicmFyeSh4bHN4KQpSYXdEYXRhIDwtIGxpc3QuZmlsZXMoZnVsbC5uYW1lcyA9IFRSVUUpICU+JSAKICBsYXBwbHkocmVhZF9jc3YpICU+JSAKICBiaW5kX3Jvd3MKI1JlYWRpbmcgbXVsdGlwbGUgY3N2IGZpbGVzIGludG8gdGhlIHNhbWUgZGF0YWZyYW1lLCB3aXRoIG9ubHkgb25lIEhlYWQgIyB3aGVuIHRoZSBmaWxlIG9ubHkgY29udGFpbnMgdGhlIGRhdGEgYW5kIHRoZSBSLW5vdGVib29rCgpSZGF0YSA8LSBSYXdEYXRhICU+JSBkcm9wX25hKExhYmVsKSAjZHJvcHBpbmcgTkEgcm93cwpSZGF0YSA8LSBSZGF0YVssLWMoMSldICNkZWxldGluZyBleHRyYSBub24taW5mb3JtYXRpdmUgY29sdW1ucyB0aGF0IGFwcGVhcnMgd2hpbGUgcmVhZGluZyB0aGUgY3N2IGZpbGUgdG8gdGhlIGRhdGFmcmFtZQpEYXRhMkhhbmRsZSA8LSBSZGF0YSU+JQogIHNlcGFyYXRlKExhYmVsLGMoIlRyZWF0bWVudCIsIkNlbGxOdW1iZXIiKSxzZXAgPSAiXyIpICMlPiUgI3NlcGVyYXRpbmcgdGhlIGxhYmVsIGNvbHVtbiBpbnRvIDIgZGlmZnJlbmV0IGNvbHVtbnMgbGFiZWxlZCBhcyB0cmVhdG1lbnQgYW5kIGNlbGwgbnVtYmVyLSB0aGVzZSB0d28gdmFyaWFibGVzIGlkZW50aWZ5IGRpZmZyZXJudCBjZWxscyB3aXRoaW4gdGhlIHNhbWUgdHJlYXRtZW50LCBib3RoIGFyZSBuZWVkZWQgaW4gdGhlIG5leHQgc3RlcHMgb2YgYW5hbHlzaXMKCkRhdGEySGFuZGxlIDwtIHNlbGVjdChEYXRhMkhhbmRsZSwtYyhNaW5UaHIsTWF4VGhyKSkgI2RlbGV0aW5nIGFub3RoZXIgMiBub24taW5mb3JtYXRpdmUgY29sdW1ucwpEYXRhMkhhbmRsZVtEYXRhMkhhbmRsZSRUcmVhdG1lbnQ9PSdTaEExLzIrU2hCMS8yK3M5NycsXSRUcmVhdG1lbnQgPC0gYygnMlNoQSsyU2hCK3M5NycpCkRhdGEySGFuZGxlW0RhdGEySGFuZGxlJFRyZWF0bWVudD09JzFTaEErMVNoQitzOTcnLF0kVHJlYXRtZW50IDwtIGMoJzJTaEErMlNoQitzOTcnKQpEYXRhMkhhbmRsZVtEYXRhMkhhbmRsZSRUcmVhdG1lbnQ9PSdzaGEzNCtzaGIxNCtzOTcnLF0kVHJlYXRtZW50IDwtIGMoJzNTaEErMVNoQitzOTcnKQpEYXRhMkhhbmRsZVtEYXRhMkhhbmRsZSRUcmVhdG1lbnQ9PSdzaGIzK3NoYTErczk3JyxdJFRyZWF0bWVudCA8LSBjKCcxU2hBKzNTaEIrczk3JykKRGF0YTJIYW5kbGVbRGF0YTJIYW5kbGUkVHJlYXRtZW50PT0nU2hBNCtTaEIwK3M5NycsXSRUcmVhdG1lbnQgPC0gYygnNFNoQSswU2hCK3M5NycpCkRhdGEySGFuZGxlW0RhdGEySGFuZGxlJFRyZWF0bWVudD09J1NoQTArU2hCNCtzOTcnLF0kVHJlYXRtZW50IDwtIGMoJzBTaEErNFNoQitzOTcnKQpEYXRhMkhhbmRsZVtEYXRhMkhhbmRsZSRUcmVhdG1lbnQ9PSdzaGIzNCtzaGExNCtzOTcnLF0kVHJlYXRtZW50IDwtIGMoJzFTaEErM1NoQitzOTcnKQpEYXRhMkhhbmRsZVtEYXRhMkhhbmRsZSRUcmVhdG1lbnQ9PSdTaEEzK1NoQjErczk3JyxdJFRyZWF0bWVudCA8LSBjKCczU2hBKzFTaEIrczk3JykKRGF0YTJIYW5kbGVbRGF0YTJIYW5kbGUkVHJlYXRtZW50PT0nU2hBMStTaEIzK3M5NycsXSRUcmVhdG1lbnQgPC0gYygnMVNoQSszU2hCK3M5NycpCkRhdGEySGFuZGxlW0RhdGEySGFuZGxlJFRyZWF0bWVudD09J1NoQTIrU2hCMitzOTcnLF0kVHJlYXRtZW50IDwtIGMoJzJTaEErMlNoQitzOTcnKQoKCkNlbGxzRGF0YUMgPC0gRGF0YTJIYW5kbGVbRGF0YTJIYW5kbGUkQXJlYT4xMDAsXSAjIHN1YnNldHRpbmcgdGhlIGRhdGEgZm9yIHRoZSB3aG9sZSBjZWxsIGludG8gYSBuZXcgZGF0YWZyYW1lLCBpbiBlYWNoIGNzdiBmaWxlIHRoZXJlIGlzIG9uZSByb3cgZm9yIHRoZSB3aG9sZSBjZWxsLSB0aGVzZSBkYXRhIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGNlbGxzIApEYXRhMkhhbmRsZSA8LSBEYXRhMkhhbmRsZVtEYXRhMkhhbmRsZSRBcmVhPDEwMCAsXSAjZWxpbWluYXRpbmcgdGhlIHJvd3Mgb2YgZGF0YSByZWdhcmRpbmcgdGhlIHdob2xlIGNlbGxzIj4zMDAiIGFuZCBhbHNvIHRoZSByb3dzIHdoZXJlIHRoZSBjbHVzdGVycyBhcmVhIHNtYWxsZXIgdGhhbiB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgbWljcm9zY29wZQpDZWxsc0RhdGEgPC0gIERhdGEySGFuZGxlICU+JQogIGdyb3VwX2J5KFRyZWF0bWVudCkgJT4lCiAgZ3JvdXBfYnkoQ2VsbE51bWJlciwuYWRkID0gVFJVRSkgJT4lCiAgZHBseXI6OnN1bW1hcmlzZShDbHVzdGVyQ291bnQgPSBuKCksU3Vtb2ZSYXdJbnREZW49c3VtKFJhd0ludERlbiksLmdyb3VwcyA9ICJrZWVwIikgI2dyb3VwaW5nIHRoZSBjZWxscyBkYXRhIGJ5IHRyZWF0bWVudCBhbmQgY2VsbCBudW1iZXItYm90aCB2YXJpYWJsZXMgbmVlZGVkIHRvIGlkZW50aWZ5IHVuaXF1ZSBjZWxscyBmcm9tIGVhY2ggb3RoZXIgYXMgd3JpdHRlbiBiZWZvcmUtIGFuZCB0aGVuIGNvdW50aW5nIGZvciBlYWNoIGNlbGwgdGhlIGNsdXN0ZXIgbnVtYmVyKGFrYSB0aGUgcm93cyBpbiBlYWNoIGZpbGUgd2hpY2ggYmVsb25nIHRvIHRoZSBzcGVjaWZpYyBjZWxsKQpDZWxsc0RhdGFDIDwtIG1lcmdlKENlbGxzRGF0YUMsQ2VsbHNEYXRhLCBieT1jKCJUcmVhdG1lbnQiLCJDZWxsTnVtYmVyIikpCiNncm91cGluZyB0aGUgY2VsbHMgZGF0YSBieSB0cmVhdG1lbnQgYW5kIGNlbGwgbnVtYmVyLWJvdGggdmFyaWFibGVzIG5lZWRlZCB0byBpZGVudGlmeSB1bmlxdWUgY2VsbHMgZnJvbSBlYWNoIG90aGVyIGFzIHdyaXR0ZW4gYmVmb3JlLSBhbmQgdGhlbiBjb3VudGluZyBmb3IgZWFjaCBjZWxsIHRoZSBjbHVzdGVyIG51bWJlcihha2EgdGhlIHJvd3MgaW4gZWFjaCBmaWxlIHdoaWNoIGJlbG9uZyB0byB0aGUgc3BlY2lmaWMgY2VsbCkKQ2VsbHNEYXRhQyA8LSBDZWxsc0RhdGFDICU+JQogIG11dGF0ZShDbHVzdGVyc051bWJlclBlckNlbGw9Q2x1c3RlckNvdW50L0FyZWEsCiAgICAgICAgIG5vbl9ub3JtbGl6ZWRDbHVzdGVyTnVtYmVyPUNsdXN0ZXJDb3VudCwKICAgICAgICAgQ2VsbFN1cmZhY2VFeHByZXNzaW9uPVJhd0ludERlbi9BcmVhLAogICAgICAgICBGcmFjdGlvbm9mQ2hhbm5lbHNpbkNsdXN0ZXJzPVN1bW9mUmF3SW50RGVuL1Jhd0ludERlbikKQ2VsbHNEYXRhQyA8LSBDZWxsc0RhdGFDWywtOV0KI0NlbGxzRGF0YUMkQ2x1c3RlcnNOdW1iZXJQZXJDZWxsIDwtIENlbGxzRGF0YSRDbHVzdGVyQ291bnQvQ2VsbHNEYXRhQyRBcmVhCiNDZWxsc0RhdGFDJG5vbl9ub3JtbGl6ZWRDbHVzdGVyTnVtYmVyPC0gQ2VsbHNEYXRhJENsdXN0ZXJDb3VudCNhZGRpbmcgdGhlIHZhaXJhYmxlIENsdXN0ZXJDb3VudCB0byB0aGUgQ2VsbHNEYXRhQwojQ2VsbHNEYXRhQyRDZWxsU3VyZmFjZUV4cHJlc3Npb24gPC0gQ2VsbHNEYXRhQyRSYXdJbnREZW4vQ2VsbHNEYXRhQyRBcmVhICNhZGRpbmcgdGhlIHZhaXJhYmxlIENlbGxTdXJmYWNlRXhwcmVzc2lvbiB0byB0aGUgQ2VsbHNEYXRhQy0gZGVmaW5lZCBhcyB0aGUgY2x1c3Rlcm51bWJlcnMgcGVyIGNlbGwgbm9ybWFsaXplZCB0byB0aGUgd2hvbGUgY2VsbCBhcmVhIChzaW5jZSBhIGhpZ2hlciBhcmVhIG9mIG1lbWJyYW5lIHdpbGwgY29udGFpbiBhcyB3ZWxsIGEgaGlnaGVyIG51bWJlciBvZiBjbHVzdGVycykgIAojQ2VsbHNEYXRhQyRGcmFjdGlvbm9mQ2hhbm5lbHNpbkNsdXN0ZXJzPUNlbGxzRGF0YSRTdW1vZlJhd0ludERlbi9DZWxsc0RhdGFDJFJhd0ludERlbgojQ2VsbHNEYXRhQyRTdW1vZlJhd0ludERlbiA8LSBDZWxsc0RhdGEkU3Vtb2ZSYXdJbnREZW4KI0NlbGxzRGF0YUMgI3Nob3dpbmcgdGhlIGRhdGEgdG8gaGF2ZSBhIGdlbmVyYWwgbG9vawoKCkRhdGEySGFuZGxlIDwtRGF0YTJIYW5kbGUgJT4lCiAgbXV0YXRlKERlbnNpdHk9IFJhd0ludERlbi9BcmVhKSAjIGFkZGluZyBhIG5ldyB2YXJpYWJsZSBjYWxjdWxhdGVkIGJ5IHRoZSBhcmVhIGFuZCBSYXdJbnREZW4gdmFyaWFibGVzIGluIHRoZSBkYXRhIGZvciBlYWNoIGNsdXN0ZXIgaW4gdGhlIGNlbGxzLCBkZWZpbmVkIGFzIERlbnNpdHkKRGF0YTJIYW5kbGU8LSBEYXRhMkhhbmRsZVssLTldI3Nob3dpbmcgdGhlIGRhdGEgdG8gaGF2ZSBhIGdlbmVyYWwgbG9vawpEYXRhMkhhbmRsZQpDZWxsc0RhdGFDCgpDZWxsc0RhdGFfc3VtIDwtICBEYXRhMkhhbmRsZSAlPiUKICBncm91cF9ieShUcmVhdG1lbnQpICU+JQogIGdyb3VwX2J5KENlbGxOdW1iZXIsLmFkZCA9IFRSVUUpICU+JQogIGRwbHlyOjpzdW1tYXJpc2UoQ2x1c3RlckNvdW50ID0gbigpLE1lYW5EZW4gPSBtZWFuKERlbnNpdHkpLE1lYW5BcmVhID0gbWVhbihBcmVhKSxTdGFuZGFyZGRkZW5zaXR5PSBzZChEZW5zaXR5KSxTdGFuZGFyZGRBcmVhPSBzZChBcmVhKSwuZ3JvdXBzID0gImtlZXAiKQp3cml0ZS5jc3YoQ2VsbHNEYXRhX3N1bSwiQ2VsbHNEYXRhX3N1bS5jc3YiLCByb3cubmFtZXMgPSBUUlVFKQoKd3JpdGUueGxzeChDZWxsc0RhdGFDLCJDZWxsc0RhdGFDX3N1bS54bHN4Iiwgcm93Lm5hbWVzID0gVFJVRSkKYGBgCgpVc2VyIG11c3QgZ2l2ZSBhcyBhbiBpbnB1dCB0aGUgbnVtYmVyIG9mIHZhcmlhYmxlcyBoZSB3YW50cyB0byBiZSBhbmFseXplZCBhbmQgdGhlaXIgZXhhY3QgbmFtZXMgYXMgdGhleSBzaG93IHVwIGluIHRoZSBEYXRhOiBEYXRhMkhhbmRsZSBvciBDZWxsc0RhdGFDLgp0aGUgaW5wdXQgaW4gdGhlIHZhcmlhYmxlIFZhcmlhYmxlVG9BbmFseXplIHdpbGwgYmUgdXNlZCBpbiBuZXh0IGNodW5rcyB0byBkZWNpZGUgd2hldGhlciB0byBydW4gYSBzcGVjaWZpYyBjb21tYW5kcyBvciBub3QtdGhhdCBpcyB0byBydW4gb25seSB0aGUgcGFydHMgZm9yIHRoZSB2YXJpYWJsZXMgc2hvd3MgaW4gVmFyaWFibGVUb0FuYWx5emUgYXMgdGhlIHVzZXIgZGVjaWRlIEhvd2V2ZXIsIHJpZ3RoIG5vdyB0aGlzIGNodW5rIGlzIGRlYWN0aXZhdGVkLSBhbmQgdGhlIHZhbHVlIG9mIFZhcmlhYmxlVG9BbmFseXplIGhhcyBiZWVuIGFzc2lnbmVkIGFzIGFsbCB0aGUgdmFyaWFibGVzIHRvIGJlIGFuYWx5emVkIC4KCmBgYHtyfQpudW1iZXJvZnZhciA8LSBhcy5pbnRlZ2VyKHJlYWRsaW5lKHByb21wdD1wYXN0ZSgiSG93IG1hbnkgeW91IHdhbnQgdG8gYW5hbHl6ZToiKSkpICNhc2tpbmcgdGhlIHVzZXIgdG8gZGVjaWRlIGhvdyBtYW55IHZhcmlhYmxlcyBoZSB3YW50IHRvIGFuYWx5emUgCm51bXZlYyA8LSBjKDE6bnVtYmVyb2Z2YXIpICMgY3JlYXRpbmcgdmVjdG9yIG9mIG51bWJlciBhY2NvcmRpbmcgdG8gdGhlIHZhcmFpYmxlIG51bWJlciBpbnB1dCBpbiB0aGUgcHJldmlvdXMgY29tbWFuZAppbnB1dHZlYyA8LSBmdW5jdGlvbihudW09MCkjZnVuY3Rpb24gdG8gdGFrZSBtdWx0aXBsZSB2YXJpYWJsZSBuYW1lcwogICNhcmd1bWVudDogdGhlIG51bWJlciBvZiB0aGUgdmFyaWFibGUgdG8gdGFrZSBhcyBhbiBpbnB1dCwgdG8gc2hvdyB0byBpdCB0byB0aGUgdXNlcgogICN2YWx1ZTogdGhlIGV4YWN0IG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIGFuYWx5c2UgLWFzIGl0IHNob3dlcyBpbiB0aGUgZGF0YWZyYW1lCnsKICB2ZWMgPC0gcmVhZGxpbmUocHJvbXB0PXBhc3RlKCJ3aGF0IGlzIHlvdXIiLCBudW0sICJ2YXJpYWJsZSBleGFjdCBuYW1lICIpKQogIHJldHVybih2ZWMpCn0KVmFyaWFibGVUb0FuYWx5emUgPC0gc2FwcGx5KG51bXZlYywgaW5wdXR2ZWMpIyB2ZWN0b3JpemVkIGNvbW1hbmQgdG8gdGFrZSBhcyBhbiBpbnB1dCB0aGUgZXhhY3QgbmFtZXMgb2YgdGhlIHZhcmlhYmxlcyB0byBiZSBhbmFseXplZApgYGAKClRoZSBuZXh0IGNodWNrIHdpbGwgcHJvY2VzcyB0aGUgRGF0YSBmb3IgdGhlIHNwZWNpZmljIHZhcmlhYmxlcyBnaXZlbiBpbiBWYXJpYWJsZVRvQW5hbHl6ZTogdGhlIGZ1bmN0aW9uIHdpbGwgcGVyZm9ybSBLb2xtb2dvcm92LVNtaXJub3YgTm9ybWFsaXR5IHRlc3QgYW5kIExldmVuZSdzIHRlc3QgZm9yIGhvbW9zY2VkYXN0aWNpdHkuClRoZSByZXN1bHQgZm9yIHRoZSB2YXJpYWJsZXMgd2lsbCBiZSBhc3NpZ25lZCBpbiBhIG5ldyBkYXRhZnJhbWUgd2l0aCB0aGUgcHJvcGVyIGNvbHVtbiBuYW1lcy4KTm90ZTogVHJ1ZSBpbiB0aGUgbmV3IGRhdGFmcmFtZS1pbmRpY2F0ZTR0cmFuc2Zvcm1hdGlvbkFsbCBzdGFuZHMgZm9yIHAtdmFsdWU8MC4wNSAoYWthIHRoZSBhc3N1bXB0aW9uIGlzIHZpb2xhdGVkKQoKYGBge3J9CkRldGVybWluZVByb3BUZXN0IDwtIGZ1bmN0aW9uKFZhck5hbWUsRGF0YSkKICAjZGVzY3JpcHRpb24gb2YgdGhlIGZ1bmN0aW9uOiB0aGUgZnVuY3Rpb24gYWNjZXB0IGFzIGFuIGFyZ3VtbnQgdGhlIHZhcmlhYmxlIG5hbWUgYXMgaXQgZGlzcGxheWVkIGluIHRoZSBkYXRhIGFuZCBjaGVjayBob21vZ2VuZWl0eSBvZiB2YXJpYW5jZSBhY3Jvc3MgZ3JvdXBzIGFuZCBub3JtYWxpdHkgb2YgcmVzaWR1YWxzCiAgI2FyZ3VtZW50LXRoZSBuYW1lIG9mIHZhcmlhYmxlIHRvIGNoZWNrIGFuZCB0aGUgZGF0YQogICN2YWx1ZS0gdmVjdG9yIG9mIGxvZ2ljYWwgdmFsdWVzICh0cnVlIHN0YW5kcyBmb3IgYXNzdW1wdGlvbiB2aW9sYXRpb24pIHRoZSAxc3QtaG9tb2dlbmVpdHktbGV2ZW5lJ3MgdGVzdCwgdGhlIDJuZC0gS29sbW9nb3Jvdi1TbWlybm92IFRlc3RzCnsKbmFtZXMoRGF0YSlbbmFtZXMoRGF0YSkgPT0gVmFyTmFtZV0gPC0gIlZhck5hbWUiICNpbiBvcmRlciB0byBwZXJmb3JtIHRoZSB0ZXN0IG9uIGEgc3BlY2lmaWMgdmFyaWFibGUsIGNoYW5naW5nIHRoZSBuYW1lIG9mIHRoaXMgdmFyaWFibGUgdG8gVmFyTmFtZS0gdGhpcyBtYWtlIGl0IGVhc2llciB0byBnZW5lcmFsaXplIHRoZSBjb2RlLCB0aHVzIGl0IGNvdWxkIGhhbmRsZSBhbGwgdGhlIHZhcmlhYmxlIG5hbWVzIGFzIHdpbGwgYmUgc2VlbiBpbiBuZXh0IGNvbW1hbmRzCiAgTW9kZWwgID0gbG0oVmFyTmFtZSB+IFRyZWF0bWVudCwKICAgICAgICAgICAgICBkYXRhPURhdGEpICNjcmVhdGluZyB0aGUgbW9kZWwgZm9yIEFub3ZhLSBkZWZpbmluZyB0aGUgZGVwZW5kZW50IGFuZCBpbmRlcGVuZGVudCB2YXJpYWJsZXMgCkFub3ZhKE1vZGVsKSAgIApzdW1tYXJ5KE1vZGVsKQojYWxsIHRoZXNlIHBhcmFtZXRlcnMgc2V0cyB0aGUgbW9kZWwgZm9yIGZ1cnRoZXIgYW5hbHlzaXMKdmVjIDwtIGFzLmludGVnZXIocmVhZGxpbmUocHJvbXB0PXBhc3RlKCJEbyB5b3Ugd2FudCB0byBzZWUgdGhlIHBsb3RzIChSZXNpZHVhbHMgSGlzdG9ncmFtIGFuZCBSZXNpZHVhbHMgdnMuIHByZWRpY3RlZCB2YWx1ZXMpIG9mIHRoZSB2YXJpYWJsZSIsVmFyTmFtZSwiWWVzLTEsIE5vLTAgIikpKSAjYWNjb3JkaW5nIHRvIHRoZSB1c2VyIGNob2ljZS1zaG93cyBvciBub3QtdGhlIHBsb3RzIHRvIGFzc2VzcyB0aGUgZGF0YSBieSBoaW1zZWxmIGluIGFkZGl0aW9uIHRvIHRoZSB0ZXN0IGNhcnJpZWQgb3V0IGluIHRoZSBmdW5jdGlvbgppZiAodmVjPT0xKSAKICB7aGlzdChyZXNpZHVhbHMoTW9kZWwpLGNvbD0iZGFya2dyYXkiKQojcGxvdChmaXR0ZWQoTW9kZWwpLHJlc2lkdWFscyhNb2RlbCkpICNwbG90dGluZyB0aGUgZml0dGVkIGRhdGEgdG8gc2VlIFRoZSBkaXN0cmlidXRpb24gb2YgdGhlc2UgcmVzaWR1YWxzIGFzIGl0IHNob3VsZCBiZSBhcHByb3hpbWF0ZWx5IG5vcm1hbC4KcXFub3JtKE1vZGVsJHJlc2lkdWFscykgICMgQW5vdGhlciBtZXRob2Qgb2YgbG9va2luZyBhdCB0aGUgcmVzaWR1YWxzIG5vcm1hbGl0eQpxcWxpbmUoTW9kZWwkcmVzaWR1YWxzKSMgc2V0dGluZyB0aGUgbm9ybWFsIGxpbmUsIGluIG9yZGVyIHRvIGFzc2lzdCB0aGUgcmVzaWR1YWxzIG5vcm1hbGl0eQpwdmFsdWVsZXZlbmUgPC0gbGV2ZW5lVGVzdChWYXJOYW1lIH4gVHJlYXRtZW50LGRhdGE9RGF0YSxjZW50ZXI9bWVhbilbMSwzXSAjYXNzaWduaW5nIHRoZSBwLXZhbHVlIG9mIGxldmVucyB0ZXN0IGludG8gYSBuZXcgdmFyaWFibGUKcHZhbHVla3MgPC0ga3MudGVzdChNb2RlbCRyZXNpZHVhbHMscG5vcm0sbWVhbihNb2RlbCRyZXNpZHVhbHMpLHNkKE1vZGVsJHJlc2lkdWFscykpW1syXV0gI2Fzc2lnbmluZyB0aGUgcC12YWx1ZSBvZiBrcyBpbnRvIGEgbmV3IHZhcmlhYmxlCnJldHVybiAoYyhwdmFsdWVsZXZlbmU8MC4wMSxwdmFsdWVrczwwLjAxKSkgI3JldHVybmluZyBib3RoIHZhbHVlcwp9ZWxzZQp7cHZhbHVlbGV2ZW5lIDwtIGxldmVuZVRlc3QoVmFyTmFtZSB+IFRyZWF0bWVudCxkYXRhPURhdGEsY2VudGVyPW1lYW4pWzEsM10jYXNzaWduaW5nIHRoZSBwLXZhbHVlIG9mIGxldmVucyB0ZXN0IGludG8gYSBuZXcgdmFyaWFibGUKcHZhbHVla3MgPC0ga3MudGVzdChNb2RlbCRyZXNpZHVhbHMscG5vcm0sbWVhbihNb2RlbCRyZXNpZHVhbHMpLHNkKE1vZGVsJHJlc2lkdWFscykpW1syXV0jYXNzaWduaW5nIHRoZSBwLXZhbHVlIG9mIGtzIGludG8gYSBuZXcgdmFyaWFibGUKcmV0dXJuIChjKHB2YWx1ZWxldmVuZTwwLjAxLHB2YWx1ZWtzPDAuMDEpKX0gI3JldHVybmluZyBib3RoIHZhbHVlcwp9CiNyZXN1bHQ0VHJhbnNvZnJtYXRpb24gPC0gRGV0ZXJtaW5lUHJvcFRlc3QoIkNsdXN0ZXJzTnVtYmVyUGVyQ2VsbCIsIENlbGxzRGF0YUMpCiNWYXJpYWJsZVRvQW5hbHl6ZSA8LSBjKCdDbHVzdGVyc051bWJlclBlckNlbGwnLCdEZW5zaXR5JywnQXJlYScsJ0NlbGxTdXJmYWNlRXhwcmVzc2lvbicpCiN4IDwtIFZhcmlhYmxlVG9BbmFseXplW1ZhcmlhYmxlVG9BbmFseXplPT0nQ2x1c3RlcnNOdW1iZXJQZXJDZWxsJ10KaW5kaWNhdGU0dHJhbnNmb3JtYXRpb25XIDwtIHQoc2FwcGx5KFZhcmlhYmxlVG9BbmFseXplW1ZhcmlhYmxlVG9BbmFseXplPT0nQ2x1c3RlcnNOdW1iZXJQZXJDZWxsJ3xWYXJpYWJsZVRvQW5hbHl6ZT09J0NlbGxTdXJmYWNlRXhwcmVzc2lvbid8VmFyaWFibGVUb0FuYWx5emU9PSdGcmFjdGlvbm9mQ2hhbm5lbHNpbkNsdXN0ZXJzJ10sIERldGVybWluZVByb3BUZXN0LCBDZWxsc0RhdGFDKSkgI3N1YnNldHRpbmcgdGhlIHZhcmlhYmxlcyBuYW1lIGJlbG9uZ2dpbmcgdG8gdGhlIGRhdGFmcmFtZSBDZWxsc0RhdGFDLCBvbiB0aGVzZSB2YXJpYWJsZXMsIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQKaW5kaWNhdGU0dHJhbnNmb3JtYXRpb25DIDwtIHQoc2FwcGx5KFZhcmlhYmxlVG9BbmFseXplW1ZhcmlhYmxlVG9BbmFseXplPT0nQXJlYSd8VmFyaWFibGVUb0FuYWx5emU9PSdEZW5zaXR5J10sIERldGVybWluZVByb3BUZXN0LCBEYXRhMkhhbmRsZSkpICNzdWJzZXR0aW5nIHRoZSB2YXJpYWJsZXMgbmFtZSBiZWxvbmdnaW5nIHRvIHRoZSBkYXRhZnJhbWUgRGF0YTJIYW5kbGUsIG9uIHRoZXNlIHZhcmlhYmxlcywgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZAojIGEgcmVzdWx0IG9mIFRydWUgZm9yIGJvdGggY29sdW1ucyBzdGFuZHMgZm9yIGEgbmVlZCBvZiB0cmFuc2Zvcm1hdGlvbiBpbiB0aGUgdmFyaWFibGUtIHNob3dzIGluIG5hbWUgb2YgdGhlIHJvdyAKaWYgKGxlbmd0aChpbmRpY2F0ZTR0cmFuc2Zvcm1hdGlvbkMpIT0wKXsgIyB0aGlzIGNvbmRpdGlvbiBpcyB0byBoYW5kbGUgYSBzaXR1YXRpb24gd2hlcmUgaXMgbm8gdmFyaWFibGVzIGdpdmVuIGJ5IHRoZSB1c2VyIGluIHRoZSBzZWNvbmQgY2h1bmsKICBjb2xuYW1lcyhpbmRpY2F0ZTR0cmFuc2Zvcm1hdGlvbkMpIDwtIGMoIkxldmVuZSdzIHRlc3QiLCAiS29sbW9nb3Jvdi1TbWlybm92IFRlc3RzIikgI3NldHRpbmcgdGhlIGNvbHVtbiBuYW1lcwogIGluZGljYXRlNHRyYW5zZm9ybWF0aW9uQyAjc2hvd2luZ2cgdGhlIHJlc3VsdHMKICBpbmRpY2F0ZTR0cmFuc2Zvcm1hdGlvbkMgPC0gYXMuZGF0YS5mcmFtZShpbmRpY2F0ZTR0cmFuc2Zvcm1hdGlvbkMpICU+JQogIGFkZF9jb2x1bW4oVmFyTj1WYXJpYWJsZVRvQW5hbHl6ZVtWYXJpYWJsZVRvQW5hbHl6ZT09J0FyZWEnfFZhcmlhYmxlVG9BbmFseXplPT0nRGVuc2l0eSddLC5iZWZvcmU9MSkgI2FkZGluZyBhIG5ldyBjb2x1bW4gd2l0aCB0aGUgdmFyaWFibGUgbmFtZXMKcm93Lm5hbWVzKGluZGljYXRlNHRyYW5zZm9ybWF0aW9uQykgPC0gTlVMTCAjcmVzZXR0aW5nIHRoZSB0aGUgcm93bmFtZXMKaW5kaWNhdGU0dHJhbnNmb3JtYXRpb25DCn0KIGlmIChsZW5ndGgoaW5kaWNhdGU0dHJhbnNmb3JtYXRpb25XKSE9MCl7ICMgdGhpcyBjb25kaXRpb24gaXMgdG8gaGFuZGxlIGEgc2l0dXRpb24gd2hlcmUgaXMgbm8gdmFyaWFibGVzIGdpdmVuIGJ5IHRoZSB1c2VyIGluIHRoZSBzZWNvbmQgY2h1bmsgCiAgY29sbmFtZXMoaW5kaWNhdGU0dHJhbnNmb3JtYXRpb25XKSA8LSBjKCJMZXZlbmUncyB0ZXN0IiwgIktvbG1vZ29yb3YtU21pcm5vdiBUZXN0cyIpI3NldHRpbmcgdGhlIGNvbHVtbiBuYW1lcwogIGluZGljYXRlNHRyYW5zZm9ybWF0aW9uVyAjc2hvd2luZ2cgdGhlIHJlc3VsdHMKaW5kaWNhdGU0dHJhbnNmb3JtYXRpb25XIDwtIGFzLmRhdGEuZnJhbWUoaW5kaWNhdGU0dHJhbnNmb3JtYXRpb25XKSAlPiUKICBhZGRfY29sdW1uKFZhck49VmFyaWFibGVUb0FuYWx5emVbVmFyaWFibGVUb0FuYWx5emU9PSdDbHVzdGVyc051bWJlclBlckNlbGwnfFZhcmlhYmxlVG9BbmFseXplPT0nQ2VsbFN1cmZhY2VFeHByZXNzaW9uJ3xWYXJpYWJsZVRvQW5hbHl6ZT09J0ZyYWN0aW9ub2ZDaGFubmVsc2luQ2x1c3RlcnMnXSwuYmVmb3JlPTEpICNhZGRpbmcgYSBuZXcgY29sdW1uIHdpdGggdGhlIHZhcmlhYmxlIG5hbWVzCnJvdy5uYW1lcyhpbmRpY2F0ZTR0cmFuc2Zvcm1hdGlvblcpIDwtIE5VTEwgI3Jlc2V0dGluZyB0aGUgdGhlIHJvd25hbWVzCmluZGljYXRlNHRyYW5zZm9ybWF0aW9uVwp9CmluZGljYXRlNHRyYW5zZm9ybWF0aW9uQWxsIDwtIHJiaW5kLmRhdGEuZnJhbWUoaW5kaWNhdGU0dHJhbnNmb3JtYXRpb25DLGluZGljYXRlNHRyYW5zZm9ybWF0aW9uVykgI2JpbmRpbmdnIHRoZSBkYXRhZnJhbWVzIHRvZ2F0aGVyCmluZGljYXRlNHRyYW5zZm9ybWF0aW9uQWxsCmBgYAoKVGhpcyBjaHVuayBpcyByZXNwb25zaWJsZSBmb3IgY2FsY3VsYXRpbmcgdGhlIHRyYW5zZm9ybWF0aW9uIHdoZW4gZXZlciBuZWVkZWQuCnRoZSB0cmFuc2Zvcm1hdGlvbiB0eXBlIGlzIGRldGVybWluZWQgYnkgYW4gTWFudWFsIGNhbGlicmF0aW9uIG9mIG15IG93biBkYXRhIGJlaGF2aW9yLgphbHNvIGhlcmUgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIGNhcnJpZWQgb3V0IG9ubHkgd2hlbiB0aGUgZGF0YSBtZXQgdGhlIGNvbmRpdGlvbnMgdG8gcGVyZm9ybSBvbmUgKHdoZW4gYm90aCBhc3N1bXB0aW9uczogbm9ybWFsaXR5IGFuZCBob21vc2NlZGFzdGljaXR5LCBhcmUgdmlvbGF0ZWQpIE5vdGU6IEkgdXNlZCB0aGUgIi1cPlw+IiB3aGl0Y2ggbWFrZXMgdGhlIGRhdGEgZ2xvYmFsLCBUaGlzIGFsbG93ZWQgbWUgdG8gY2hhbmdlIGFuZCB1cGRhdGUgZGlyZWN0bHkgYm90aCBkYXRhZnJhbWVzIHdoZW5ldmVyIGkgbmVlZGVkKENlbGxzRGF0YUMvRGF0YTJIYW5kbGUpCgpgYGB7cn0KdHJhbnMubG9nIDwtIGZ1bmN0aW9uKHgpe3JldHVybihsb2cyKHgpKX0gI21hdGhtYXRpY2FsIGZ1bmN0aW9uIGZvciB0cmFuc2Zvcm1hdGlvbiBjYWxjdWxhdGlvbgp0cmFucy5zcXJ0IDwtIGZ1bmN0aW9uKHgpe3JldHVybihzcXJ0KHgrMC41KSl9ICNtYXRobWF0aWNhbCBmdW5jdGlvbiBmb3IgdHJhbnNmb3JtYXRpb24gY2FsY3VsYXRpb24KdHJhbnMucmVjZWlwIDwtIGZ1bmN0aW9uKHgpe3JldHVybigxLyh4KSl9ICNtYXRobWF0aWNhbCBmdW5jdGlvbiBmb3IgdHJhbnNmb3JtYXRpb24gY2FsY3VsYXRpb24KI29sZCA8LSBEYXRhMkhhbmRsZQojRGF0YTJIYW5kbGUgPC0gYmFja3VwClRyYW5zVXBkYXRlIDwtIGZ1bmN0aW9uKFZhclJvdykKICAjZnVuY3Rpb24gZGVzY3JpcHRpb246IHRoZSBmdW5jdGlvbiBhY2NlcHQgYXMgYXJnZ3VtZW50L2lucHV0IGEgcm93IG9mIGRhdGFmcmFtZSwgY29udGFpbmVpbmcgMyBjb2x1bW5zLiB0aGUgZmlyc3Qgcm93IGlzIHRoZSB2YXJpYWJsZSBuZWVkZWQgdG8gdHJhbmZvcm0gdGhlIHNlY29uZCBhbmQgdGhlIHRoaXJkIGFyZSB0aGUgcmVzdWx0IG9mIGxldmVuZXMgYW5kIGtzIHRlc3QgLSBUcnVlIHN0YW5kcyBmb3IgYSBwLXZhbHVlIGxvd2VyIHRoYW4gMC4wNSAoYm90aCB0cnVlIHN0YW5kcyBmb3IgYSBuZWVkIG9mIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBkYXRhIGZvciB0aGlzIHNwZWNpZmljIHZhcmlhYmxlKQogICNvdXRwb3QgaXMgYSBkYXRhZnJhbWUgdXBkYXRlZCB3aXRoIGEgY29sdW1uIG9mIHRyYW5zZm9ybWF0ZWQgZGF0YSBvZiB2YXJpYWJsZQp7CiAgI1ZhclJvdyA8LSBpbmRpY2F0ZTR0cmFuc2Zvcm1hdGlvblsyLF0KICBEYXRhMkhhbmRsZTw8LURhdGEySGFuZGxlICMgY2hhbmdpbmcgdGhlIGRhdGFmcmFtZSBvZiBlYWNoIGNsdXN0ZXIgdG8gYmUgZ2xvYmFsLyBhbHNvIHNob3dzIGluIHRoZSBmdW5jdGlvbiBpdHNlbGYKICBDZWxsc0RhdGFDPDwtQ2VsbHNEYXRhQyMgY2hhbmdpbmcgdGhlIGRhdGFmcmFtZSBvZiB0aGUgd2hvbGUgY2VsbHMgdG8gYmUgZ2xvYmFsLyBhbHNvIHNob3dzIGluIHRoZSBmdW5jdGlvbiBpdHNlbGYKICBpZiAoVmFyUm93WzFdICVpbiUgYygiRGVuc2l0eSIsIkFyZWEiKSkgI2NoZWNraW5nIGlmIHRoZSB2YXJpYWJsZSBiZWxvbmcgdG8gdGhlIGRhdGEgb2YgY2x1c3RlcnMKICB7CiAgICBpZiAoVmFyUm93WzFdPT0iRGVuc2l0eSIpeyAjaWYgdGhlIHZhcmlhYmxlIGluIHRoZSBhcmd1bWVudCBpcyBkZW5zaXR5LCB0aGVuIGNhbGN1bGF0aW5nIHRoZSBhcHByb3ByaWF0ZSB0eXBlIG9mIHRyYW5zZm9ybWF0aW9uIGZvciB0aGUgZGVuc2l0eQogICAgICBEYXRhMkhhbmRsZSREZW5zaXR5LnRyYW5zPDwtIHNhcHBseShEYXRhMkhhbmRsZSREZW5zaXR5LHRyYW5zLnNxcnQpCiAgICB9IGVsc2V7ICNpZiB0aGUgdmFyaWFibGUgaW4gdGhlIGFyZ3VtZW50IGlzIEFyZWEsIHRoZW4gY2FsY3VsYXRpbmcgdGhlIGFwcHJvcHJpYXRlIHR5cGUgb2YgdHJhbnNmb3JtYXRpb24gZm9yIHRoZSBhcmVhCiAgICAgIERhdGEySGFuZGxlJEFyZWEudHJhbnM8PC0gc2FwcGx5KERhdGEySGFuZGxlJEFyZWEsdHJhbnMubG9nKX0KICB9ZWxzZSAjb3RoZXJ3aXNlLCB0aGUgdmFyaWFibGUgYmVsb25nIHRvIHRoZSB3aG9sZSBjZWxsIGRhdGEKICB7CiAgICBpZiAoVmFyUm93WzFdPT0nQ2VsbFN1cmZhY2VFeHByZXNzaW9uJyl7Q2VsbHNEYXRhQyRDZWxsU3VyZmFjZUV4cHJlc3Npb24udHJhbnMgPDwtIHNhcHBseShDZWxsc0RhdGFDJENlbGxTdXJmYWNlRXhwcmVzc2lvbix0cmFucy5zcXJ0KX0gI2lmIHRoZSB2YXJpYWJsZSBpbiB0aGUgYXJndW1lbnQgaXMgQ2VsbFN1cmZhY2VFeHByZXNzaW9uLCB0aGVuIGNhbGN1bGF0aW5nIHRoZSBhcHByb3ByaWF0ZSB0eXBlIG9mIHRyYW5zZm9ybWF0aW9uIGZvciB0aGUgQ2VsbFN1cmZhY2VFeHByZXNzaW9uCiAgICAgIGVsc2V7Q2VsbHNEYXRhQyRDbHVzdGVyc051bWJlclBlckNlbGwudHJhbnMgPDwtIHNhcHBseShDZWxsc0RhdGFDJENsdXN0ZXJzTnVtYmVyUGVyQ2VsbCx0cmFucy5yZWNlaXApfSAjaWYgdGhlIHZhcmlhYmxlIGluIHRoZSBhcmd1bWVudCBpcyBDbHVzdGVyc051bWJlclBlckNlbGwsIHRoZW4gY2FsY3VsYXRpbmcgdGhlIGFwcHJvcHJpYXRlIHR5cGUgb2YgdHJhbnNmb3JtYXRpb24gZm9yIHRoZSBDbHVzdGVyc051bWJlclBlckNlbGwKICB9CiAgCiAgQ2VsbHNEYXRhQzw8LUNlbGxzRGF0YUMKICBEYXRhMkhhbmRsZTw8LURhdGEySGFuZGxlIAp9CmlmKCFpcy5udWxsKGluZGljYXRlNHRyYW5zZm9ybWF0aW9uQWxsKSl7CmFwcGx5KGluZGljYXRlNHRyYW5zZm9ybWF0aW9uQWxsW2luZGljYXRlNHRyYW5zZm9ybWF0aW9uQWxsJGBMZXZlbmUncyB0ZXN0YD09VCAmIGluZGljYXRlNHRyYW5zZm9ybWF0aW9uQWxsJGBLb2xtb2dvcm92LVNtaXJub3YgVGVzdHNgPT1ULF0sTUFSR0lOPTEsVHJhbnNVcGRhdGUpfSAjYXBwbHlpbmcgdGhlIGZ1bmN0aW9uIG9uIHRoZSBkYXRhIGZyYW1lCiNwbGVhc2UgcGF5IGF0dGVudGlvbiwgdGhlIGFwcGx5IGlzIHN1aXRhYmxlIGZvciB1cGRhdGluZyBnbG9iYWwgdmFyaWFibGVzCkRhdGEySGFuZGxlCkNlbGxzRGF0YUMKCmBgYAoKVGhpcyBjaHVuayBjb250YWluIGFsbCB0aGUgcG9zc2libGUgc3RhdGlzdGljcyB0ZXN0IHN1aXRhYmxlIGZvciBhIG51bWVyaWMgZGVwZW5kZW50IHZhcmlhYmxlIGFuZCBhIGluZGVwZW5kZW50IHZhcmlhYmxlIHdpdGggbW9yZSB0aGVuIHR3byBsZXZlbHMuClRoaXMgaXMgbmVlZGVkIHNpbmNlIGkgaGF2ZSBwYXJ0aWFsIGRhdGEgZm9yIG5vdywgaSBkb24ndCBrbm93IHdoZXRoZXIgbXkgZGF0YSB3aWxsIHZpb2xhdGUgYm90aCBhc3N1bXB0aW9uIGluIHRoZSBmdXR1cmUgb3Igbm90LCBzbyBqdXN0IGluIGNhc2UuClRoZSB0ZXN0cyB3aWxsIGJlIHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gaW5kaWNhdGU0dHJhbnNmb3JtYXRpb25BbGwgcmVzdWx0cy4KV2hlbiB0aGUgY29uZGl0aW9ucyBhcmVuJ3QgbWV0LCBBIE51bGwgZGF0YWZyYW1lIHdpbGwgYmUgc2VudCB0byB0aGUgdGVzdCBzbyBubyByZXN1bHQgd2lsbCBiZSBzaG93bi4KQXMgaXQgY291bGQgYmUgc2VlbiBteSBwYXJ0aWFsIGRhdGEgd2lsbCBuZWVkIEFOT1ZBIChhZnRlciB0cmFuc2Zvcm1hdGlvbi8gd2l0aCBubyB0cmFuc2Zvcm1hdGlvbikKCmBgYHtyfQoKd2VsY2h0ZXN0IDwtIGZ1bmN0aW9uKHZhcm5hbWUsIERhdGEpCiAgIyBkZXNjcmlwdGlvbjogdGhlIGZ1bmN0aW9uIHRha2VzIGFzIGFuIGFyZ3VtZW50IGEgdmFyaWFibGUgdGhhdCBpcyBmb3VuZCBpbiB0aGUgZGF0YSwgYWxvbmcgd2l0aCB2YXJpYWJsZSBuZWVkZWQgdG8gYmUgdGVzdGVkIHRoZSBmdW5jdGlvbiB0YWtlcyBhbHNvIHRoZSBkYXRhIGl0c2VsZi4KICAjb3V0cHV0OiBOdWxsLCB0aGUgZnVuY3Rpb24gc2hvd3MgdGhlIHJlc3VsdCBvZiB3ZWxjaCB0ZXN0IG9mIHRoZSB2YXJpYWJsZQp7CiAgbmFtZXMoRGF0YSlbbmFtZXMoRGF0YSkgPT0gdmFybmFtZV0gPC0gInZhcm5hbWUiICNjaGFuZ2luZyB0aGUgY29sdW1uIG5hbWUtaW4gdGhlIGFyZ3VtbmV0cy0gdG8gdmFybmFtZSwgdGhpcyBoZWxwcyBnZW5lcmxhaXppbmcgdGhlIGNvZGUsIHNvIGl0IHdvdWxkIHJ1biBpbiBlYWNoIHZhcmlhYmxlIG5hbWUKICBvbmV3YXkudGVzdCh2YXJuYW1lIH4gVHJlYXRtZW50LAogICAgICAgICAgICBkYXRhPURhdGEsCiAgICAgICAgICAgIHZhci5lcXVhbD1GQUxTRSkgI3BlcmZvcm1pbmcgdGhlIHRlc3QKfQpwcmludCgiV2VsY2ggdGVzdCByZXN1bHQgaWYgdGhlIGNvbmRpdGlvbnMgYXJlIG1ldCBpcyBiZWxvdyIpCkNXZWxjaCA8LSBzYXBwbHkoaW5kaWNhdGU0dHJhbnNmb3JtYXRpb25BbGxbaW5kaWNhdGU0dHJhbnNmb3JtYXRpb25BbGwkYExldmVuZSdzIHRlc3RgPT1UICYgaW5kaWNhdGU0dHJhbnNmb3JtYXRpb25BbGwkYEtvbG1vZ29yb3YtU21pcm5vdiBUZXN0c2A9PUYgJiAoaW5kaWNhdGU0dHJhbnNmb3JtYXRpb25BbGwkVmFyTj09J0FyZWEnfGluZGljYXRlNHRyYW5zZm9ybWF0aW9uQWxsJFZhck49PSdEZW5zaXR5JyksMV0sIHdlbGNodGVzdCwgRGF0YTJIYW5kbGUpCnNhcHBseShpbmRpY2F0ZTR0cmFuc2Zvcm1hdGlvbkFsbFtpbmRpY2F0ZTR0cmFuc2Zvcm1hdGlvbkFsbCRgTGV2ZW5lJ3MgdGVzdGA9PVQgJiBpbmRpY2F0ZTR0cmFuc2Zvcm1hdGlvbkFsbCRgS29sbW9nb3Jvdi1TbWlybm92IFRlc3RzYD09RiAmIChpbmRpY2F0ZTR0cmFuc2Zvcm1hdGlvbkFsbCRWYXJOPT0nQ2VsbFN1cmZhY2VFeHByZXNzaW9uJ3xpbmRpY2F0ZTR0cmFuc2Zvcm1hdGlvbkFsbCRWYXJOPT0nQ2x1c3RlcnNOdW1iZXJQZXJDZWxsJyksMV0sIHdlbGNodGVzdCwgQ2VsbHNEYXRhQykKI2JvdGggY29tbWFuZHMgc2VuZCB0aGUgdGhlIHR3byBkaWZmcmVuZXQgRGF0YWZyYW1lIGkgaGF2ZSB0byB0aGUgZnVuY3Rpb24gZm9yIHdlbGNoLXRlc3Qgd2l0aCB0aGUgcmVsYXZhbnQgdmFyaWFibGUgbmFtZSwgb25seSB3aGVuIHRoZSByZXN1bHQgb2YgbGV2ZW5zIGFuZCBLb2xtb2dvcm92LVNtaXJubyBpcyBULEYgcmVzcGVjdGl2bHkgLSB0aGF0IGlzIGhldGVyb3NjZWRhc3RpY2l0eSBpcyBmb3VuZCBpbiB0aGUgZGlmZnJlbnQgZ3JvdXBzLiB0aGlzIGlzIGRvbmUgYnkgc2VuZGluZyB0aGUgYXBwcm9wcmlhdGUgZGF0YWZyYW1lIHdpdGggdGhlIHZhcmlhYmxlIHRvIHRlc3QuCiMjIyMjIyMjIyMjIyMjIyMjIyMjCgpLV3Rlc3QgPC0gZnVuY3Rpb24odmFybmFtZSwgRGF0YSkKICAjIGRlc2NyaXB0aW9uOiB0aGUgZnVuY3Rpb24gdGFrZXMgYXMgYW4gYXJndW1lbnQgYSB2YXJpYWJsZSB0aGF0IGlzIGZvdW5kIGluIHRoZSBkYXRhLCBhbG9uZyB3aXRoIHZhcmlhYmxlIG5lZWRlZCB0byBiZSB0ZXN0ZWQgdGhlIGZ1bmN0aW9uIHRha2VzIGFsc28gdGhlIGRhdGEgaXRzZWxmLgogICNvdXRwdXQ6IE51bGwsIHRoZSBmdW5jdGlvbiBzaG93cyB0aGUgcmVzdWx0IG9mIEtydXNrYWwtd2FsaXMgdGVzdCBvZiB0aGUgdmFyaWFibGUKewogIG5hbWVzKERhdGEpW25hbWVzKERhdGEpID09IHZhcm5hbWVdIDwtICJ2YXJuYW1lIiAjY2hhbmdpbmcgdGhlIGNvbHVtbiBuYW1lLWluIHRoZSBhcmd1bW5ldHMtIHRvIHZhcm5hbWUsIHRoaXMgaGVscHMgZ2VuZXJsYWl6aW5nIHRoZSBjb2RlLCBzbyBpdCB3b3VsZCBydW4gaW4gZWFjaCB2YXJpYWJsZSBuYW1lCiAga3J1c2thbC50ZXN0KHZhcm5hbWUgfiBUcmVhdG1lbnQsCiAgICAgICAgICAgICAgICBkYXRhID0gRGF0YSkgI3BlcmZvcm1pbmcgdGhlIHRlc3QKfQpwcmludCgiS3J1c2thbC1XYWxsaXMgdGVzdCByZXN1bHQgaWYgdGhlIGNvbmRpdGlvbnMgYXJlIG1ldCBpcyBiZWxvdyIpCnNhcHBseShpbmRpY2F0ZTR0cmFuc2Zvcm1hdGlvbkFsbFtpbmRpY2F0ZTR0cmFuc2Zvcm1hdGlvbkFsbCRgTGV2ZW5lJ3MgdGVzdGA9PUYgJiBpbmRpY2F0ZTR0cmFuc2Zvcm1hdGlvbkFsbCRgS29sbW9nb3Jvdi1TbWlybm92IFRlc3RzYD09VCAmIChpbmRpY2F0ZTR0cmFuc2Zvcm1hdGlvbkFsbCRWYXJOPT0nQXJlYSd8aW5kaWNhdGU0dHJhbnNmb3JtYXRpb25BbGwkVmFyTj09J0RlbnNpdHknKSwxXSwgS1d0ZXN0LCBEYXRhMkhhbmRsZSkKc2FwcGx5KGluZGljYXRlNHRyYW5zZm9ybWF0aW9uQWxsW2luZGljYXRlNHRyYW5zZm9ybWF0aW9uQWxsJGBMZXZlbmUncyB0ZXN0YD09RiAmIGluZGljYXRlNHRyYW5zZm9ybWF0aW9uQWxsJGBLb2xtb2dvcm92LVNtaXJub3YgVGVzdHNgPT1UICYgKGluZGljYXRlNHRyYW5zZm9ybWF0aW9uQWxsJFZhck49PSdDZWxsU3VyZmFjZUV4cHJlc3Npb24nfGluZGljYXRlNHRyYW5zZm9ybWF0aW9uQWxsJFZhck49PSdDbHVzdGVyc051bWJlclBlckNlbGwnKSwxXSwgS1d0ZXN0LCBDZWxsc0RhdGFDKQojYm90aCBjb21tYW5kcyBzZW5kIHRoZSB0aGUgdHdvIGRpZmZyZW5ldCBEYXRhZnJhbWUgaSBoYXZlIHRvIHRoZSBmdW5jdGlvbiBmb3Iga3J1c2thbC13YWxsaXMsIG9ubHkgd2hlbiB0aGUgcmVzdWx0IG9mIGxldmVucyBhbmQgS29sbW9nb3Jvdi1TbWlybm8gaXMgRixUIHJlc3BlY3Rpdmx5IC0gdGhhdCBpcyBOb3JtYWxpdHkgYXNzdW1wdGlvbiBpcyB2aW9sYXRlZC4gdGhpcyBpcyBkb25lIGVhY2ggdGltZSBieSBzZW5kaW5nIHRoZSBhcHByb3ByaWF0ZSBkYXRhZnJhbWUgd2l0aCB0aGUgdmFyaWFibGUgdG8gdGVzdC4KIyMjIyMjIyMjIyMjIwoKCkFub3ZhdGVzdCA8LSBmdW5jdGlvbih2YXJuYW1lLCBEYXRhKQogICMgZGVzY3JpcHRpb246IHRoZSBmdW5jdGlvbiB0YWtlcyBhcyBhbiBhcmd1bWVudCBhIHZhcmlhYmxlIHRoYXQgaXMgZm91bmQgaW4gdGhlIGRhdGEsIGFsb25nIHdpdGggdmFyaWFibGUgbmVlZGVkIHRvIGJlIHRlc3RlZCB0aGUgZnVuY3Rpb24gdGFrZXMgYWxzbyB0aGUgZGF0YSBpdHNlbGYuCiAgI291dHB1dDogTnVsbCwgdGhlIGZ1bmN0aW9uIHNob3dzIHRoZSByZXN1bHQgb2YgQW5vdmEgdGVzdCBvZiB0aGUgdmFyaWFibGUKewogIG5hbWVzKERhdGEpW25hbWVzKERhdGEpID09IHZhcm5hbWVdIDwtICJ2YXJuYW1lIgogIE1vZGVsICA9IGxtKHZhcm5hbWUgfiBUcmVhdG1lbnQsCiAgICAgICAgICAgICAgZGF0YT1EYXRhKSAjY3JlYXRpbmcgdGhlIG1vZGVsIGZvciBBbm92YS0gZGVmaW5pbmcgdGhlIGRlcGVuZGVudCBhbmQgaW5kZXBlbmRlbnQgdmFyaWFibGVzIChWYXJpYWJsZSB0byBhbmFseXNpcyBhbmQgVHJlYXRtZW50IHJlc3BlY3RpdmVseSkKYyA8LSBjKHVubGlzdChhbm92YShNb2RlbClbMSw0OjVdKSApIwpyZXR1cm4oYykKfQojIyMjIyMjIyMjIyMjCgpwcmludCgiQU5PVkEgdGVzdCByZXN1bHQgaWYgdGhlIGNvbmRpdGlvbnMgYXJlIG1ldCBpcyBiZWxvdyIpCm5ldzRhbm92YSA8LSBpbmRpY2F0ZTR0cmFuc2Zvcm1hdGlvbkFsbFsoaW5kaWNhdGU0dHJhbnNmb3JtYXRpb25BbGwkYExldmVuZSdzIHRlc3RgPT1GICYgaW5kaWNhdGU0dHJhbnNmb3JtYXRpb25BbGwkYEtvbG1vZ29yb3YtU21pcm5vdiBUZXN0c2A9PUYpIHwoaW5kaWNhdGU0dHJhbnNmb3JtYXRpb25BbGwkYExldmVuZSdzIHRlc3RgPT1UICYgaW5kaWNhdGU0dHJhbnNmb3JtYXRpb25BbGwkYEtvbG1vZ29yb3YtU21pcm5vdiBUZXN0c2A9PVQpLF0gI3N1YnNldGlpbmcgdGhlIHZhcmlhYmxlcyBzdWl0YWJsZSBmb3IgQU5PVkEgdGVzdCAodHJhbnNmb3JtZWQgZGF0YSBhbmQgZGF0YSB3aGljaCBpcyBOb3JtYWwgYW5kIGhhcyBob21vZ2VuZWl0eSBvZiB2YXJpYW5jZXMpLCBmcm9tIHRoZSByZXN1bHQgZGF0YWZyYW1lIG9mIGxldmVucyBhbmQgS29sbW9nb3Jvdi1TbWlybm92LgoKbmV3NGFub3ZhWyhpbmRpY2F0ZTR0cmFuc2Zvcm1hdGlvbkFsbCRgTGV2ZW5lJ3MgdGVzdGA9PVQgJiBpbmRpY2F0ZTR0cmFuc2Zvcm1hdGlvbkFsbCRgS29sbW9nb3Jvdi1TbWlybm92IFRlc3RzYD09VCksXSRWYXJOIDwtIHNhcHBseShuZXc0YW5vdmFbKGluZGljYXRlNHRyYW5zZm9ybWF0aW9uQWxsJGBMZXZlbmUncyB0ZXN0YD09VCAmIGluZGljYXRlNHRyYW5zZm9ybWF0aW9uQWxsJGBLb2xtb2dvcm92LVNtaXJub3YgVGVzdHNgPT1UKSxdJFZhck4scGFzdGUsc2VwPSIuIiwidHJhbnMiKQojdXBkYXRpbmcgdGhlIHJlc3VsdHMgZGF0YWZyYW1lIGZpcnN0IGNvbHVtbiB3aGVuIHRoZSB2YXJpYWJsZSBpbiB0aGUgcm93IGlzIHRyYW5zZm9ybWF0ZWQuCgpBbm92YXJlc0MgPC0gc2FwcGx5KG5ldzRhbm92YVsobmV3NGFub3ZhJFZhck49PSJEZW5zaXR5LnRyYW5zIiB8IG5ldzRhbm92YSRWYXJOPT0iQXJlYS50cmFucyIgfG5ldzRhbm92YSRWYXJOPT0iRGVuc2l0eSIgfCBuZXc0YW5vdmEkVmFyTj09IkFyZWEiKSwxXSxBbm92YXRlc3QsIERhdGEySGFuZGxlKQojYXBwbGluZyBBTk9WQSBvbiB0aGUgdmFyaWFibGVzIHN1aXRlZCB3aXRoIHRoZSB0ZXN0IGluIHRoZSBEYXRhZnJhbWUgb2YgdGhlIGNsdXN0ZXJzCkFub3ZhcmVzVyA8LSBzYXBwbHkobmV3NGFub3ZhWyhuZXc0YW5vdmEkVmFyTj09IkNlbGxTdXJmYWNlRXhwcmVzc2lvbi50cmFucyIgfCBuZXc0YW5vdmEkVmFyTj09IkNsdXN0ZXJzTnVtYmVyUGVyQ2VsbC50cmFucyJ8bmV3NGFub3ZhJFZhck49PSJDZWxsU3VyZmFjZUV4cHJlc3Npb24iIHwgbmV3NGFub3ZhJFZhck49PSJDbHVzdGVyc051bWJlclBlckNlbGwiKSwxXSxBbm92YXRlc3QsIENlbGxzRGF0YUMpCiNhcHBsaW5nIEFOT1ZBIG9uIHRoZSB2YXJpYWJsZXMgc3VpdGVkIHdpdGggdGhlIHRlc3QgaW4gdGhlIERhdGFmcmFtZSBvZiB3aG9sZSBjZWxscwoKQW5vdmFyZXNDCkFub3ZhcmVzVwoKCgoKYGBgCgp0aGlzCgpgYGB7cn0KI2NoZWNrIGRpZmZlcmVuY2VzIGluIEZyYWN0aW9ub2ZDaGFubmVsc2luQ2x1c3RlcnMKQW5vdmFyZXNXXzMgPC0gc2FwcGx5KCJGcmFjdGlvbm9mQ2hhbm5lbHNpbkNsdXN0ZXJzIixBbm92YXRlc3QsIENlbGxzRGF0YUMpCkFub3ZhcmVzV18zCgojY2hlY2sgCiNNb2RlbEZyYWN0aW9uICA9IGxtKEZyYWN0aW9ub2ZDaGFubmVsc2luQ2x1c3RlcnMgfiBUcmVhdG1lbnQsCiMgICAgICAgICAgICAgIGRhdGE9Q2VsbHNEYXRhQykgI2NyZWF0aW5nIHRoZSBtb2RlbCBmb3IgQW5vdmEtIGRlZmluaW5nIHRoZSBkZXBlbmRlbnQgYW5kIGluZGVwZW5kZW50IHZhcmlhYmxlcyAoVmFyaWFibGUgdG8gYW5hbHlzaXMgYW5kIFRyZWF0bWVudCByZXNwZWN0aXZlbHkpCiNzdW1tYXJ5KE1vZGVsRnJhY3Rpb24pCmBgYAoKSW4gdGhpcyBjaHVjayBhIFR1Y2tleSBwYWlyd2lzZSBtdWx0aXBsZSBjb21wYXJpc29uIChwb3N0LWhvYykgaXMgZG9uZSBmb3IgYWxsIHRoZSB2YXJpYWJsZXMuCgpgYGB7cn0KbGlicmFyeShhZ3JpY29sYWUpCiNpbiBhbGwgdGhvc2UgY29tbWFuZHMgYSB0dWtleSBtdWx0aXBsZSBjb21wYXJzaW9uIHRlc3QgaXMgY2FycmllZCBvdXQKaWYgKCJEZW5zaXR5IiAlaW4lIFZhcmlhYmxlVG9BbmFseXplKXsKbW9kZWwgID0gbG0oRGVuc2l0eS50cmFucyB+IFRyZWF0bWVudCwKICAgICAgICAgICAgICBkYXRhPURhdGEySGFuZGxlKSAjY3JlYXRpbmcgdGhlIG1vZGVsIGZvciBBbm92YS0gZGVmaW5pbmcgdGhlIGRlcGVuZGVudCBhbmQgaW5kZXBlbmRlbnQgdmFyaWFibGVzIChWYXJpYWJsZSB0byBhbmFseXNpcy1EZW5zaXR5LnRyYW5zIGFuZCBUcmVhdG1lbnQgcmVzcGVjdGl2ZWx5KQpQV0RlbnNpdHkgPC0gKEhTRC50ZXN0KG1vZGVsLCAiVHJlYXRtZW50IiwgZ3JvdXAgPSBGKSkgI3R1a2V5IHRlc3QKUFdEZW5zaXR5fQppZiAoIkFyZWEiICVpbiUgVmFyaWFibGVUb0FuYWx5emUpewpNb2RlbCAgPSBsbShBcmVhLnRyYW5zIH4gVHJlYXRtZW50LAogICAgICAgICAgICAgIGRhdGE9RGF0YTJIYW5kbGUpICNjcmVhdGluZyB0aGUgbW9kZWwgZm9yIEFub3ZhLSBkZWZpbmluZyB0aGUgZGVwZW5kZW50IGFuZCBpbmRlcGVuZGVudCB2YXJpYWJsZXMgKFZhcmlhYmxlIHRvIGFuYWx5c2lzLUFyZWEudHJhbnMgYW5kIFRyZWF0bWVudCByZXNwZWN0aXZlbHkpClBXQXJlYSA8LSAoSFNELnRlc3QoTW9kZWwsICJUcmVhdG1lbnQiLCBncm91cCA9IEYpKSAjdHVrZXkgdGVzdApQV0FyZWF9CmlmICgiQ2x1c3RlcnNOdW1iZXJQZXJDZWxsIiAlaW4lIFZhcmlhYmxlVG9BbmFseXplKXsKTW9kZWwgID0gbG0oQ2x1c3RlcnNOdW1iZXJQZXJDZWxsIH4gVHJlYXRtZW50LAogICAgICAgICAgICAgIGRhdGE9Q2VsbHNEYXRhQykgI2NyZWF0aW5nIHRoZSBtb2RlbCBmb3IgQW5vdmEtIGRlZmluaW5nIHRoZSBkZXBlbmRlbnQgYW5kIGluZGVwZW5kZW50IHZhcmlhYmxlcyAoVmFyaWFibGUgdG8gYW5hbHlzaXMtQ2x1c3RlcnNOdW1iZXJQZXJDZWxsIGFuZCBUcmVhdG1lbnQgcmVzcGVjdGl2ZWx5KQpQV0NsdXN0ZXJzTnVtYmVyUGVyQ2VsbCA8LSAoSFNELnRlc3QoTW9kZWwsICJUcmVhdG1lbnQiLCBncm91cCA9IEYpKSAjdHVrZXkgdGVzdApQV0NsdXN0ZXJzTnVtYmVyUGVyQ2VsbH0KaWYgKCJDZWxsU3VyZmFjZUV4cHJlc3Npb24iICVpbiUgVmFyaWFibGVUb0FuYWx5emUpewpNb2RlbCAgPSBsbShDZWxsU3VyZmFjZUV4cHJlc3Npb24gfiBUcmVhdG1lbnQsCiAgICAgICAgICAgICAgZGF0YT1DZWxsc0RhdGFDKSAjY3JlYXRpbmcgdGhlIG1vZGVsIGZvciBBbm92YS0gZGVmaW5pbmcgdGhlIGRlcGVuZGVudCBhbmQgaW5kZXBlbmRlbnQgdmFyaWFibGVzIChWYXJpYWJsZSB0byBhbmFseXNpcy1DZWxsU3VyZmFjZUV4cHJlc3Npb24gYW5kIFRyZWF0bWVudCByZXNwZWN0aXZlbHkpClBXQ2VsbFN1cmZhY2VFeHByZXNzaW9uIDwtIChIU0QudGVzdChNb2RlbCwgIlRyZWF0bWVudCIsIGdyb3VwID0gRikpICN0dWtleSB0ZXN0ClBXQ2VsbFN1cmZhY2VFeHByZXNzaW9ufQoKbmV3X21vZGVsPWxtKEZyYWN0aW9ub2ZDaGFubmVsc2luQ2x1c3RlcnMgfiBUcmVhdG1lbnQsCiAgICAgICAgICAgICAgZGF0YT1DZWxsc0RhdGFDKQpQV0ZyYWN0aW9ub2ZDaGFubmVsc2luQ2x1c3RlcnMgPC0gSFNELnRlc3QobmV3X21vZGVsLCAiVHJlYXRtZW50IiwgZ3JvdXAgPSBGKQpQV0ZyYWN0aW9ub2ZDaGFubmVsc2luQ2x1c3RlcnMKYGBgCgpuZXcgdHJ5CgpgYGB7cn0KbGlicmFyeShhZ3JpY29sYWUpCiNpbiBhbGwgdGhvc2UgY29tbWFuZHMgYSB0dWtleSBtdWx0aXBsZSBjb21wYXJzaW9uIHRlc3QgaXMgY2FycmllZCBvdXQKaWYgKCJEZW5zaXR5IiAlaW4lIFZhcmlhYmxlVG9BbmFseXplKXsKbW9kZWwgID0gbG0oRGVuc2l0eS50cmFucyB+IFRyZWF0bWVudCwKICAgICAgICAgICAgICBkYXRhPURhdGEySGFuZGxlKSAjY3JlYXRpbmcgdGhlIG1vZGVsIGZvciBBbm92YS0gZGVmaW5pbmcgdGhlIGRlcGVuZGVudCBhbmQgaW5kZXBlbmRlbnQgdmFyaWFibGVzIChWYXJpYWJsZSB0byBhbmFseXNpcy1EZW5zaXR5LnRyYW5zIGFuZCBUcmVhdG1lbnQgcmVzcGVjdGl2ZWx5KQpQV0RlbnNpdHkgPC0gKEhTRC50ZXN0KG1vZGVsLCAiVHJlYXRtZW50IiwgZ3JvdXAgPSBUKSkgI3R1a2V5IHRlc3QKUFdEZW5zaXR5fQppZiAoIkFyZWEiICVpbiUgVmFyaWFibGVUb0FuYWx5emUpewpNb2RlbCAgPSBsbShBcmVhLnRyYW5zIH4gVHJlYXRtZW50LAogICAgICAgICAgICAgIGRhdGE9RGF0YTJIYW5kbGUpICNjcmVhdGluZyB0aGUgbW9kZWwgZm9yIEFub3ZhLSBkZWZpbmluZyB0aGUgZGVwZW5kZW50IGFuZCBpbmRlcGVuZGVudCB2YXJpYWJsZXMgKFZhcmlhYmxlIHRvIGFuYWx5c2lzLUFyZWEudHJhbnMgYW5kIFRyZWF0bWVudCByZXNwZWN0aXZlbHkpClBXQXJlYSA8LSAoSFNELnRlc3QoTW9kZWwsICJUcmVhdG1lbnQiLCBncm91cCA9IFQpKSAjdHVrZXkgdGVzdApQV0FyZWF9CmlmICgiQ2x1c3RlcnNOdW1iZXJQZXJDZWxsIiAlaW4lIFZhcmlhYmxlVG9BbmFseXplKXsKTW9kZWwgID0gbG0oQ2x1c3RlcnNOdW1iZXJQZXJDZWxsIH4gVHJlYXRtZW50LAogICAgICAgICAgICAgIGRhdGE9Q2VsbHNEYXRhQykgI2NyZWF0aW5nIHRoZSBtb2RlbCBmb3IgQW5vdmEtIGRlZmluaW5nIHRoZSBkZXBlbmRlbnQgYW5kIGluZGVwZW5kZW50IHZhcmlhYmxlcyAoVmFyaWFibGUgdG8gYW5hbHlzaXMtQ2x1c3RlcnNOdW1iZXJQZXJDZWxsIGFuZCBUcmVhdG1lbnQgcmVzcGVjdGl2ZWx5KQpQV0NsdXN0ZXJzTnVtYmVyUGVyQ2VsbCA8LSAoSFNELnRlc3QoTW9kZWwsICJUcmVhdG1lbnQiLCBncm91cCA9IFQpKSAjdHVrZXkgdGVzdApQV0NsdXN0ZXJzTnVtYmVyUGVyQ2VsbH0KaWYgKCJDZWxsU3VyZmFjZUV4cHJlc3Npb24iICVpbiUgVmFyaWFibGVUb0FuYWx5emUpewpNb2RlbCAgPSBsbShDZWxsU3VyZmFjZUV4cHJlc3Npb24gfiBUcmVhdG1lbnQsCiAgICAgICAgICAgICAgZGF0YT1DZWxsc0RhdGFDKSAjY3JlYXRpbmcgdGhlIG1vZGVsIGZvciBBbm92YS0gZGVmaW5pbmcgdGhlIGRlcGVuZGVudCBhbmQgaW5kZXBlbmRlbnQgdmFyaWFibGVzIChWYXJpYWJsZSB0byBhbmFseXNpcy1DZWxsU3VyZmFjZUV4cHJlc3Npb24gYW5kIFRyZWF0bWVudCByZXNwZWN0aXZlbHkpClBXQ2VsbFN1cmZhY2VFeHByZXNzaW9uIDwtIChIU0QudGVzdChNb2RlbCwgIlRyZWF0bWVudCIsIGdyb3VwID0gVCkpICN0dWtleSB0ZXN0ClBXQ2VsbFN1cmZhY2VFeHByZXNzaW9ufQoKbmV3X21vZGVsPWxtKEZyYWN0aW9ub2ZDaGFubmVsc2luQ2x1c3RlcnMgfiBUcmVhdG1lbnQsCiAgICAgICAgICAgICAgZGF0YT1DZWxsc0RhdGFDKQpQV0ZyYWN0aW9ub2ZDaGFubmVsc2luQ2x1c3RlcnMgPC0gSFNELnRlc3QobmV3X21vZGVsLCAiVHJlYXRtZW50IiwgZ3JvdXAgPSBUKQpQV0ZyYWN0aW9ub2ZDaGFubmVsc2luQ2x1c3RlcnMKYGBgCgpTdW1tZXJpemluZyB0aGUgZGF0YSBmb3IgdGhlIHZhcmlhYmxlIENlbGxTdXJmYWNlRXhwcmVzc2lvbiwgY2FsY3VsYXRpb24gdGhlIHN0YW5kYXJkIGVycm9yIGZvciBhIGJhciBwbG90IHdpdGggc2UuCnRoZSBzYW1tZXJpemVkIGRhdGEgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBiYXIgcGxvdCB3aXRoIHN0YW5kYXJkIGVycm9yIHNob3duIGluIHRoZSBiYXJzLgp0aGUgc3VtbWVyaXplZCBkYXRhIHdpbGwgYmUgc2F2ZWQgaW4gYSBkaWlmZXJlbnQgcGF0aCBhcyBhIGNzdiBmaWxlCgpgYGB7cn0KaWYgKCJDZWxsU3VyZmFjZUV4cHJlc3Npb24iICVpbiUgVmFyaWFibGVUb0FuYWx5emUpeyAjaWYgdGhlIHVzZXIgd2FudHMgdG8gYW5hbHl6ZSB0aGlzIHZhcmlhYmxlCkRhdGExID0gc3VtbWFyeVNFKGRhdGE9Q2VsbHNEYXRhQywKICAgICAgICAgICAgICJDZWxsU3VyZmFjZUV4cHJlc3Npb24iLAogICAgICAgICAgICAgZ3JvdXB2YXJzPSJUcmVhdG1lbnQiLAogICAgICAgICAgICAgY29uZi5pbnRlcnZhbCA9IDAuOTUpICNjcmVhdGluZ2cgYSBuZXcgc3VtbWVyeSBkYXRhZnJhbWUgZ29yIHBsb3R0aW5nIHB1cnBvc2VzCmRhdGFpIDwtIGFzLmRhdGEuZnJhbWUoUFdDZWxsU3VyZmFjZUV4cHJlc3Npb24kZ3JvdXBzKSAjIGNoYW5naW5nIHRoZSB0dWtleSByZXN1bHQgZm9yIHRoaXMgdmFyaWFibGUgaW50byBhIGRhdGFmcmFtZS0gaW4gb3JkZXIgdG8gZXh0cmFjdCB0aGUgZ3JvdXAgZnJvbSBpdCwgd2hpdGNoIHNob3dzIHdldGhlciB0d28gbGV2ZWxzIHdpdGhpbiB0aGUgdGVzdGVkIHZhcmlhYmxlIGRpZmZlciBzaWduaWZpY2F0bHkKZGF0YWkkVHJlYXRtZW50IDwtIHJvdy5uYW1lcyhQV0NlbGxTdXJmYWNlRXhwcmVzc2lvbiRncm91cHMpICNhZGRpbmcgYSBjb2x1bW4gZm9yIHRyZWF0bWVudCBkYXRhaSwgZm9yIHRoZSBuZXh0IHN0ZXAKRGF0YTEgPC0gbWVyZ2UoRGF0YTEsZGF0YWlbLC0xXSwgYnk9IlRyZWF0bWVudCIpIyBhc3NpZ25pbmcgdGhpcyBpbnRvIHRoZSBzdW1tZXJ5IGRhdGEKb2Zmc2V0LnYgPSAtMyAjIG9mZnNldHMgZm9yIG1lYW4gbGV0dGVycyAKb2Zmc2V0LmggPSAwLjgKcGxvdF8xIDwtIGdncGxvdChEYXRhMSwKICAgICAgICAgICAgYWVzKHggPSBUcmVhdG1lbnQsIHkgPSBDZWxsU3VyZmFjZUV4cHJlc3Npb24sCiAgICAgICAgICAgICAgICB5bWF4PTIuMCwgeW1pbj0wLjApKSAgKwogICAgICAgICAgICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIGZpbGw9ImRhcmsgZ3JlZW4iLApjb2xvdXIgPSAiZGFyayBncmVlbiIsIHdpZHRoID0gMC43KSArIGdlb21fZXJyb3JiYXIoYWVzKHltYXg9Q2VsbFN1cmZhY2VFeHByZXNzaW9uK3NlLCB5bWluPUNlbGxTdXJmYWNlRXhwcmVzc2lvbi1zZSksCndpZHRoPTAuMiwgc2l6ZT0wLjUsIGNvbG9yPSJibGFjayIpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbD1ncm91cHMsCiAgICAgICAgICAgICAgICAgICAgICBoanVzdD0wLjgsIHZqdXN0PS00KSkgKwogICAgICAgICAgICBsYWJzKHggPSAiRGlmZmVyZW50IHJhdGlvIG9mIEJvdGggVmFyaWFudHMgU2hBIGFuZCBTaEIiLAogICAgICAgICAgICAgICAgIHkgPSAiTWVhbiBDZWxsU3VyZmFjZUV4cHJlc3Npb24tQ2x1c3RlcnMvQXJlYSBzaXplKHVtXjIpIikgICsKICAgICAgICAgICAgIGdndGl0bGUoIk5vcm1hbGl6ZWQgTWVhbiBDZWxsU3VyZmFjZUV4cHJlc3Npb24gaW4gZGlmZmVyZW50IFNoQi9TaEEgcmF0aW9zIikgKwogICAgICAgICAgICB0aGVtZV9idygpICArCiAgICAgICAgICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgxLjIpLAogICAgICAgICAgICAgICAgICBmYWNlID0gImJvbGQiLCB2anVzdCA9IDEuNSksCiAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiksCiAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dCh2anVzdD0gMS44KSwKICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHZqdXN0PSAtMC41KSwKICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KCBzaXplPTcpLAogICAgICAgICAgICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyPSJibGFjayIpLAogICAgICAgICAgICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgICAgICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siKSkKcHJpbnQocGxvdF8xKyAgYW5ub3RhdGUoInRleHQiLCBsYWJlbCA9ICIiLCB5ID0gMS45LHg9NSwgc2l6ZSA9IDMpKSAjc2V0dGluZyB0aGUgcGxvdCBhcyBuZWVkZWQKd3JpdGUuY3N2KERhdGExLCJDZWxsU3VyZmFjZUV4cHJlc3Npb25TdW1tZXJ5LmNzdiIsIHJvdy5uYW1lcyA9IFRSVUUpCn0KYGBgCgpTdW1tZXJpemluZyB0aGUgZGF0YSBmb3IgdGhlIHZhcmlhYmxlIENlbGxTdXJmYWNlRXhwcmVzc2lvbiwgY2FsY3VsYXRpb24gdGhlIHN0YW5kYXJkIGVycm9yIGZvciBhIGJhciBwbG90IHdpdGggc2UuCnRoZSBzYW1tZXJpemVkIGRhdGEgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBiYXIgcGxvdCB3aXRoIHN0YW5kYXJkIGVycm9yIHNob3duIGluIHRoZSBiYXJzIC4KdGhlIHN1bW1lcml6ZWQgZGF0YSB3aWxsIGJlIHNhdmVkIGluIGEgZGlpZmVyZW50IHBhdGggYXMgYSBjc3YgZmlsZQoKYGBge3J9CmlmICgiQ2x1c3RlcnNOdW1iZXJQZXJDZWxsIiAlaW4lIFZhcmlhYmxlVG9BbmFseXplKXsgI2lmIHRoZSB1c2VyIGNob29zZSB0byBhbmFseXplIHRoaXMgdmFyaWFibGUsIHJlc3VsdCBzaG93cwpEYXRhMiA9IHN1bW1hcnlTRShkYXRhPUNlbGxzRGF0YUMsCiAgICAgICAgICAgICAiQ2x1c3RlcnNOdW1iZXJQZXJDZWxsIiwKICAgICAgICAgICAgIGdyb3VwdmFycz0iVHJlYXRtZW50IiwKICAgICAgICAgICAgIGNvbmYuaW50ZXJ2YWwgPSAwLjk1KSNjcmVhdGluZ2cgYSBuZXcgc3VtbWVyeSBkYXRhZnJhbWUgZ29yIHBsb3R0aW5nIHB1cnBvc2VzCmRhdGFpIDwtIGFzLmRhdGEuZnJhbWUubGlzdChQV0NsdXN0ZXJzTnVtYmVyUGVyQ2VsbCRncm91cHMpIyBjaGFuZ2luZyB0aGUgdHVrZXkgcmVzdWx0IGZvciB0aGlzIHZhcmlhYmxlIGludG8gYSBkYXRhZnJhbWUtIGluIG9yZGVyIHRvIGV4dHJhY3QgdGhlIGdyb3VwIGZyb20gaXQsIHdoaXRjaCBzaG93cyB3ZXRoZXIgdHdvIGxldmVscyB3aXRoaW4gdGhlIHRlc3RlZCB2YXJpYWJsZSBkaWZmZXIgc2lnbmlmaWNhdGx5CmRhdGFpJFRyZWF0bWVudCA8LSByb3cubmFtZXMoUFdDbHVzdGVyc051bWJlclBlckNlbGwkZ3JvdXBzKSNhZGRpbmcgYSBjb2x1bW4gZm9yIHRyZWF0bWV0IGRhdGFpLCBmb3IgdGhlIG5leHQgc3RlcApEYXRhMiA8LSBtZXJnZShEYXRhMixkYXRhaVssLTFdLCBieT0iVHJlYXRtZW50IikjIGFzc2lnbmluZyB0aGlzIGludG8gdGhlIHN1bW1lcnkgZGF0YQpvZmZzZXQudiA9IC0zICMgb2Zmc2V0cyBmb3IgbWVhbiBsZXR0ZXJzIApvZmZzZXQuaCA9IDAuOApwbG90XzIgPC0gZ2dwbG90KERhdGEyLAogICAgICAgICAgICBhZXMoeCA9IFRyZWF0bWVudCwgeSA9IENsdXN0ZXJzTnVtYmVyUGVyQ2VsbCwKICAgICAgICAgICAgICAgIHltYXg9MS4wLCB5bWluPTAuMCkpICArCiAgICAgICAgICAgIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgZmlsbD0iYmxhY2siLApjb2xvdXIgPSAiYmxhY2siLCB3aWR0aCA9IDAuNykgKyBnZW9tX2Vycm9yYmFyKGFlcyh5bWF4PUNsdXN0ZXJzTnVtYmVyUGVyQ2VsbCtzZSwgeW1pbj1DbHVzdGVyc051bWJlclBlckNlbGwtc2UpLAp3aWR0aD0wLjIsIHNpemU9MC41LCBjb2xvcj0iYmxhY2siKSArIGdlb21fdGV4dChhZXMobGFiZWw9Z3JvdXBzLAogICAgICAgICAgICAgICAgICAgICAgaGp1c3Q9MS40LCB2anVzdD0tMykpICsKICAgICAgICAgICAgbGFicyh4ID0gIkRpZmZlcmVudCByYXRpbyBvZiBCb3RoIFZhcmlhbnRzIFNoQSBhbmQgU2hCIiwKICAgICAgICAgICAgICAgICB5ID0gIk1lYW4gQ2x1c3RlcnNOdW1iZXJQZXJDZWxsIFBlciBjZWxsIikgICsKICAgICAgICAgICAgIGdndGl0bGUoIk5vcm1hbGl6ZWQgTWVhbiBDbHVzdGVyc051bWJlclBlckNlbGwgaW4gZGlmZmVyZW50IFNoQi9TaEEgcmF0aW9zIikgKwogICAgICAgICAgICB0aGVtZV9idygpICArCiAgICAgICAgICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgxLjIpLAogICAgICAgICAgICAgICAgICBmYWNlID0gImJvbGQiLCB2anVzdCA9IDEuNSksCiAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiksCiAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dCh2anVzdD0gMS44KSwKICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHZqdXN0PSAtMC41KSwKICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KCBzaXplPTcpLAogICAgICAgICAgICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyPSJibGFjayIpLAogICAgICAgICAgICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgICAgICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siKSkKcHJpbnQocGxvdF8yKyAgYW5ub3RhdGUoInRleHQiLCBsYWJlbCA9ICIiLCB5ID0wLjcseD01LCBzaXplID0gMykpCndyaXRlLmNzdihEYXRhMiwiQ2x1c3RlcnNOdW1iZXJQZXJDZWxsU3VtbWVyeS5jc3YiLCByb3cubmFtZXMgPSBUUlVFKX0KYGBgCgpTdW1tZXJpemluZyB0aGUgZGF0YSBmb3IgdGhlIHZhcmlhYmxlIENlbGxTdXJmYWNlRXhwcmVzc2lvbiwgY2FsY3VsYXRpb24gdGhlIHN0YW5kYXJkIGVycm9yIGZvciBhIGJhciBwbG90IHdpdGggc2UuCnRoZSBzYW1tZXJpemVkIGRhdGEgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBiYXIgcGxvdCB3aXRoIHN0YW5kYXJkIGVycm9yIHNob3duIGluIHRoZSBiYXJzIGFuZCBhbHNvIHdpbGwgYmUgdXNlZCBmb3IgY3JlYXRpbmcgYSBib3hwbG90IGZvciB0aGlzIHZhcmlhYmxlLgoiRGVuc2l0eSIgVGhlIHN1bW1lcml6ZWQgZGF0YSB3aWxsIGJlIHNhdmVkIGluIGEgZGlpZmVyZW50IHBhdGggYXMgYSBjc3YgZmlsZS4KCmBgYHtyfQppZiAoIkRlbnNpdHkiICVpbiVWYXJpYWJsZVRvQW5hbHl6ZSl7ICNpZiB0aGUgdXNlciB3YW50cyB0byBhbmFseXplIHRoaXMgdmFyaWFibGUsIHRoZSByZXN1bHRzIHNob3cKRGF0YTMgPSBzdW1tYXJ5U0UoZGF0YT1EYXRhMkhhbmRsZSwKICAgICAgICAgICAgICJEZW5zaXR5IiwKICAgICAgICAgICAgIGdyb3VwdmFycz0iVHJlYXRtZW50IiwKICAgICAgICAgICAgIGNvbmYuaW50ZXJ2YWwgPSAwLjk1KSNjcmVhdGluZ2cgYSBuZXcgc3VtbWVyeSBkYXRhZnJhbWUgZ29yIHBsb3R0aW5nIHB1cnBvc2VzCmRhdGFpIDwtIGFzLmRhdGEuZnJhbWUubGlzdChQV0RlbnNpdHkkZ3JvdXBzKSMgY2hhbmdpbmcgdGhlIHR1a2V5IHJlc3VsdCBmb3IgdGhpcyB2YXJpYWJsZSBpbnRvIGEgZGF0YWZyYW1lLSBpbiBvcmRlciB0byBleHRyYWN0IHRoZSBncm91cCBmcm9tIGl0LCB3aGl0Y2ggc2hvd3Mgd2V0aGVyIHR3byBsZXZlbHMgd2l0aGluIHRoZSB0ZXN0ZWQgdmFyaWFibGUgZGlmZmVyIHNpZ25pZmljYXRseQpkYXRhaSRUcmVhdG1lbnQgPC0gcm93Lm5hbWVzKFBXRGVuc2l0eSRncm91cHMpI2FkZGluZyBhIGNvbHVtbiBmb3IgdHJlYXRtZXQgZGF0YWksIGZvciB0aGUgbmV4dCBzdGVwCkRhdGEzIDwtIG1lcmdlKERhdGEzLGRhdGFpWywtMV0sIGJ5PSJUcmVhdG1lbnQiKSMgYXNzaWduaW5nIHRoaXMgaW50byB0aGUgc3VtbWVyeSBkYXRhCm9mZnNldC52ID0gLTMgIyBvZmZzZXRzIGZvciBtZWFuIGxldHRlcnMgCm9mZnNldC5oID0gMC44CnBsb3RfMyA8LSBnZ3Bsb3QoRGF0YTMsCiAgICAgICAgICAgIGFlcyh4ID0gVHJlYXRtZW50LCB5ID0gRGVuc2l0eSwKICAgICAgICAgICAgICAgIHltYXg9Mi4wLCB5bWluPTAuMCkpICArCiAgICAgICAgICAgIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgZmlsbD0gImRhcmsgYmx1ZSIsCmNvbG91ciA9ICJibHVlIiwgd2lkdGggPSAwLjcpICsgZ2VvbV9lcnJvcmJhcihhZXMoeW1heD1EZW5zaXR5K3NlLCB5bWluPURlbnNpdHktc2UpLAp3aWR0aD0wLjIsIHNpemU9MC41LCBjb2xvcj0iYmxhY2siKSArIGdlb21fdGV4dChhZXMobGFiZWw9Z3JvdXBzLAogICAgICAgICAgICAgICAgICAgICAgaGp1c3Q9MSwgdmp1c3Q9LTEpKSArCiAgICAgICAgICAgIGxhYnMoeCA9ICJEaWZmZXJlbnQgcmF0aW8gb2YgQm90aCBWYXJpYW50cyBTaEEgYW5kIFNoQiIsCiAgICAgICAgICAgICAgICAgeSA9ICJNZWFuIG9mIENsdXN0ZXJzIERlbnNpdHkgKEEuVS9jbHVzdGVyIGFyZWEgc2l6ZSh1bV4yKSkiKSAgKwogICAgICAgICAgICAgZ2d0aXRsZSgiTWVhbiBvZiBDbHVzdGVycyBEZW5zaXR5IGluIGRpZmZlcmVudCBTaEIvU2hBIHJhdGlvcyIpICsKICAgICAgICAgICAgdGhlbWVfYncoKSAgKwogICAgICAgICAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMS4yKSwKICAgICAgICAgICAgICAgICAgZmFjZSA9ICJib2xkIiwgdmp1c3QgPSAxLjUpLAogICAgICAgICAgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpLAogICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQodmp1c3Q9IDEuOCksCiAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dCh2anVzdD0gLTAuNSksCiAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dCggc2l6ZT03KSwKICAgICAgICAgICAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91cj0iYmxhY2siKSwKICAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgICAgICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgICAgICAgICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIikpCnByaW50KHBsb3RfMysgIGFubm90YXRlKCJ0ZXh0IiwgbGFiZWwgPSAiIiwgeSA9IDMwMDAwMCx4PTUsIHNpemUgPSAzKSkKd3JpdGUuY3N2KERhdGEzLCJEZW5zaXR5U3VtbWVyeS5jc3YiLCByb3cubmFtZXMgPSBUUlVFKX0KYGBgCgpTdW1tZXJpemluZyB0aGUgZGF0YSBmb3IgdGhlIHZhcmlhYmxlIENlbGxTdXJmYWNlRXhwcmVzc2lvbiwgY2FsY3VsYXRpb24gdGhlIHN0YW5kYXJkIGVycm9yIGZvciBhIGJhciBwbG90IHdpdGggc2UuCnRoZSBzYW1tZXJpemVkIGRhdGEgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBiYXIgcGxvdCB3aXRoIHN0YW5kYXJkIGVycm9yIHNob3duIGluIHRoZSBiYXJzIGFuZCBhbHNvIHdpbGwgYmUgdXNlZCBmb3IgY3JlYXRpbmcgYSBib3hwbG90IGZvciB0aGlzIHZhcmlhYmxlLgoiQXJlYSIgdGhlIHN1bW1lcml6ZWQgZGF0YSB3aWxsIGJlIHNhdmVkIGluIGEgZGlpZmVyZW50IHBhdGggYXMgYSBjc3YgZmlsZQoKYGBge3J9CmlmICgiQXJlYSIgJWluJSBWYXJpYWJsZVRvQW5hbHl6ZSl7ICNpZiB0aGUgdXNlciB3YW50cyB0byBhbmFseXplIHRoaXMgdmFyaWFibGUsIHRoZSByZXN1bHRzIHNob3cKRGF0YTQgPSBzdW1tYXJ5U0UoZGF0YT1EYXRhMkhhbmRsZSwKICAgICAgICAgICAgICJBcmVhIiwKICAgICAgICAgICAgIGdyb3VwdmFycz0iVHJlYXRtZW50IiwKICAgICAgICAgICAgIGNvbmYuaW50ZXJ2YWwgPSAwLjk1KSNjcmVhdGluZ2cgYSBuZXcgc3VtbWVyeSBkYXRhZnJhbWUgZ29yIHBsb3R0aW5nIHB1cnBvc2VzCmRhdGFpIDwtIGFzLmRhdGEuZnJhbWUubGlzdChQV0FyZWEkZ3JvdXBzKSMgY2hhbmdpbmcgdGhlIHR1a2V5IHJlc3VsdCBmb3IgdGhpcyB2YXJpYWJsZSBpbnRvIGEgZGF0YWZyYW1lLSBpbiBvcmRlciB0byBleHRyYWN0IHRoZSBncm91cCBmcm9tIGl0LCB3aGl0Y2ggc2hvd3Mgd2V0aGVyIHR3byBsZXZlbHMgd2l0aGluIHRoZSB0ZXN0ZWQgdmFyaWFibGUgZGlmZmVyIHNpZ25pZmljYXRseQpkYXRhaSRUcmVhdG1lbnQgPC0gcm93Lm5hbWVzKFBXQXJlYSRncm91cHMpI2FkZGluZyBhIGNvbHVtbiBmb3IgdHJlYXRtZXQgZGF0YWksIGZvciB0aGUgbmV4dCBzdGVwCkRhdGE0IDwtIG1lcmdlKERhdGE0LGRhdGFpWywtMV0sIGJ5PSJUcmVhdG1lbnQiKSMgYXNzaWduaW5nIHRoaXMgaW50byB0aGUgc3VtbWVyeSBkYXRhCm9mZnNldC52ID0gLTMgIyBvZmZzZXRzIGZvciBtZWFuIGxldHRlcnMgCm9mZnNldC5oID0gMC44ICMgb2Zmc2V0cyBmb3IgbWVhbiBsZXR0ZXJzCnBsb3RfNCA8LSBnZ3Bsb3QoRGF0YTQsCiAgICAgICAgICAgIGFlcyh4ID0gVHJlYXRtZW50LCB5ID0gQXJlYSwKICAgICAgICAgICAgICAgIHltYXg9MC4xMSwgeW1pbj0wLjApKSAgKwogICAgICAgICAgICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIGZpbGw9ImdyYXkiLApjb2xvdXIgPSAiYmxhY2siLCB3aWR0aCA9IDAuNykgKyBnZW9tX2Vycm9yYmFyKGFlcyh5bWF4PUFyZWErc2UsIHltaW49QXJlYS1zZSksCndpZHRoPTAuMiwgc2l6ZT0wLjUsIGNvbG9yPSJibGFjayIpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbD1ncm91cHMsCiAgICAgICAgICAgICAgICAgICAgICBoanVzdD0wLjUsIHZqdXN0PS0xLjUpKSArIAogICAgICAgICAgICBsYWJzKHggPSAiRGlmZmVyZW50IHJhdGlvIG9mIEJvdGggVmFyaWFudHMgU2hBIGFuZCBTaEIiLAogICAgICAgICAgICAgICAgIHkgPSAiTWVhbiBvZiBDbHVzdGVycyBBcmVhIHNpemUodW1eMikiKSAgKwogICAgICAgICAgICAgZ2d0aXRsZSgiTWVhbiBvZiBDbHVzdGVycyBBcmVhIFNpemUgaW4gZGlmZmVyZW50IFNoQi9TaEEgcmF0aW9zIikgKwogICAgICAgICAgICB0aGVtZV9idygpICArCiAgICAgICAgICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgxLjIpLAogICAgICAgICAgICAgICAgICBmYWNlID0gImJvbGQiLCB2anVzdCA9IDEuNSksCiAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiksCiAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dCh2anVzdD0gMS44KSwKICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHZqdXN0PSAtMC41KSwKICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KCBzaXplPTcpLAogICAgICAgICAgICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyPSJibGFjayIpLAogICAgICAgICAgICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgICAgICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siKSkKcHJpbnQocGxvdF80KyAgYW5ub3RhdGUoInRleHQiLCBsYWJlbCA9ICIiLCB5ID0gMC4xOSx4PTUsIHNpemUgPSAzKSkKd3JpdGUuY3N2KERhdGE0LCJBcmVhU3VtbWVyeS5jc3YiLCByb3cubmFtZXMgPSBUUlVFKX0KYGBgCgpIaXN0b2dyYW1zIHBsb3QgZm9yIGFsbCB0cmVhdG1lbnQgdG8gc2VlIHRoZSByZWxhdGl2ZSBmcmVxdWVuY3kgYW5kIHRoZSBkaXN0cmlidXRpb24gb2YgZWFjaCB0cmVhdG1lbnQgcmVsYXRpdmx5IHRvIG90aGVycy0gdGhpcyBpcyBkb25lIGluIHRoZSBzYW1lIHBsb3QtIEJvdGggdmFyaWFibGVzIGFyZSBzaG93biBpbiB0aG9zZSBoaXN0b2dyYW1zICJEZW5zaXR5IiBhbmQgIkFyZWEiLVZhcmlhYmxlVG9BbmFseXplCgpgYGB7cn0KaWYgKCJEZW5zaXR5IiAlaW4lIFZhcmlhYmxlVG9BbmFseXplKXsgI2lmIHRoZSB1c2VyIHdhbnRzIHRvIGFuYWx5emUgdGhpcyB2YXJpYWJsZSwgdGhlIHJlc3VsdHMgc2hvdwpoaXN0X2FsbERlbnNpdHkgPC0gZ2dwbG90KERhdGEySGFuZGxlLCBhZXMoRGVuc2l0eS8xMDAwMDAsIHltYXg9MS4wLCB5bWluPTAuMCkpICsKICBmYWNldF93cmFwKH5UcmVhdG1lbnQsIHNjYWxlcyA9ICdmcmVlX3gnKSArCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSBzdGF0KGNvdW50KSAvIHN1bShjb3VudCksY29sb3IgPSBUcmVhdG1lbnQsIGZpbGwgPSBUcmVhdG1lbnQpKSsgIAogICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMS4yKSwKICAgICAgICAgICAgICAgICAgZmFjZSA9ICJib2xkIiwgdmp1c3QgPSAxLjUsIGhqdXN0ID0gMC41KSwKICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSwKICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHZqdXN0PSAxLjgpLAogICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQodmp1c3Q9IC0wLjUpLAogICAgICAgICAgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoIHNpemU9NyksCiAgICAgICAgICAgICAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgICAgICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLAogICAgICAgICAgICAgICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIikpKwogICAgICAgICAgICBsYWJzKHggPSAiRGVuc2l0eS1JbnRlZ3JhdGVkIEludGluc2l0eSoxMF41ICgoQS5VKS9jbHVzdGVyIGFyZWEgc2l6ZSh1bV4yKSkiLAogICAgICAgICAgICAgICAgIHkgPSAiUmVsYXRpdmUgZnJlcXVlbmN5IikgICsKICAgICAgICAgICAgIGdndGl0bGUoIlJlbGF0aXZlIGZyZXF1ZW5jeSBvZiBDbHVzdGVycyBEZW5zaXR5IikKaGlzdF9hbGxEZW5zaXR5fQppZiAoIkFyZWEiICVpbiUgVmFyaWFibGVUb0FuYWx5emUpeyAjaWYgdGhlIHVzZXIgd2FudHMgdG8gYW5hbHl6ZSB0aGlzIHZhcmlhYmxlLCB0aGUgcmVzdWx0cyBzaG93Cmhpc3RfYWxsQXJlYSA8LSBnZ3Bsb3QoRGF0YTJIYW5kbGUsIGFlcyhBcmVhLCB5bWF4PTEuMCwgeW1pbj0wLjApKSArCiAgZmFjZXRfd3JhcCh+VHJlYXRtZW50LCBzY2FsZXMgPSAnZnJlZV94JykgKwogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gc3RhdChjb3VudCkgLyBzdW0oY291bnQpLGNvbG9yID0gVHJlYXRtZW50LCBmaWxsID0gVHJlYXRtZW50KSkrICAKICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDEuMiksCiAgICAgICAgICAgICAgICAgIGZhY2UgPSAiYm9sZCIsIHZqdXN0ID0gMS41LCBoanVzdCA9IDAuNSksCiAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiksCiAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dCh2anVzdD0gMS44KSwKICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHZqdXN0PSAtMC41KSwKICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KCBzaXplPTcpLAogICAgICAgICAgICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICAgICAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwKICAgICAgICAgICAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIpKSsKICAgICAgICAgICAgbGFicyh4ID0gIk1lYW4gb2YgQ2x1c3RlcnMgQXJlYSBzaXplKHVtXjIpIiwKICAgICAgICAgICAgICAgICB5ID0gIlJlbGF0aXZlIGZyZXF1ZW5jeSIpICArCiAgICAgICAgICAgICBnZ3RpdGxlKCJSZWxhdGl2ZSBmcmVxdWVuY3kgb2YgQ2x1c3RlcnMgQXJlYSBTaXplIE1lYW4odW1eMikiKSAKaGlzdF9hbGxBcmVhfQpgYGAKCmp1c3QgaW4gY2FzZS0gYW5vdGhlciBwbG90IHRvIHNlZSB0aGUgdmFyaWFibGVzCgpgYGB7ciBldmFsPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQoKZGY0IDwtIERhdGEySGFuZGxlICU+JQogIGFkZF9jb2x1bW4oLmFmdGVyPTcscmF0aW8gPSBOQSklPiUKICBtdXRhdGUocmF0aW89IGlmZWxzZSggVHJlYXRtZW50ID09IjRTaEErMFNoQitzOTciLDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoVHJlYXRtZW50PT0iMFNoQSs0U2hCK3M5NyIsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFRyZWF0bWVudD09IjJTaEErMlNoQitzOTciLDEvMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFRyZWF0bWVudD09IjFTaEErM1NoQitzOTciLDEvNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShUcmVhdG1lbnQ9PSczU2hBKzFTaEIrczk3JywzLzQscmF0aW8pKSkpKSkKQm94YkRlbnNpdHkgPC0gZ2dwbG90KGRmNCwgYWVzKHg9cmF0aW8sIHk9RGVuc2l0eS8xMDAwMDAwLCBmaWxsID0gVHJlYXRtZW50KSkgKyAKICBnZW9tX2JveHBsb3QoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgxLjIpLAogICAgICAgICAgICAgICAgICBmYWNlID0gImJvbGQiLCB2anVzdCA9IDEuNSwgaGp1c3QgPSAwLjUpLAogICAgICAgICAgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpLAogICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQodmp1c3Q9IDEuOCksCiAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dCh2anVzdD0gLTAuNSksCiAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dCggc2l6ZT03KSwKICAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksCiAgICAgICAgICAgICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siKSkrCiAgICAgICAgICAgIGxhYnMoeCA9ICJEaWZmZXJlbnQgcmF0aW8gb2YgQm90aCBWYXJpYW50cyBTaEEgYW5kIFNoQiAoU2hCL1NoQSkiLAogICAgICAgICAgICAgICAgIHkgPSAiRGVuc2l0eS1JbnRlZ3JhdGVkIEludGluc2l0eSoxMF42ICgoQS5VKS9jbHVzdGVyIGFyZWEgc2l6ZSh1bV4yKSkiKSAgKwogICAgICAgICAgICAgZ2d0aXRsZSgiQ2x1c3RlcnMgRGVuc2l0eSBpbiBEaWZmZXJlbnQgUmF0aW9zIG9mIFNoQi9TaEEgdmFyaWFudHMiKQpCb3hiRGVuc2l0eQoKQm94YkFyZWEgPC0gZ2dwbG90KGRmNCwgYWVzKHg9cmF0aW8sIHk9QXJlYSwgZmlsbCA9IFRyZWF0bWVudCkpICsgCiAgZ2VvbV9ib3hwbG90KCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMS4yKSwKICAgICAgICAgICAgICAgICAgZmFjZSA9ICJib2xkIiwgdmp1c3QgPSAxLjUsIGhqdXN0ID0gMC41KSwKICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSwKICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHZqdXN0PSAxLjgpLAogICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQodmp1c3Q9IC0wLjUpLAogICAgICAgICAgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoIHNpemU9NyksCiAgICAgICAgICAgICAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgICAgICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLAogICAgICAgICAgICAgICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIikpKwogICAgICAgICAgICBsYWJzKHggPSAiRGlmZmVyZW50IHJhdGlvIG9mIEJvdGggVmFyaWFudHMgU2hBIGFuZCBTaEIiLAogICAgICAgICAgICAgICAgIHkgPSAiTWVhbiBvZiBDbHVzdGVyIEFyZWEgU2l6ZSh1bV4yKSkiKSAgKwogICAgICAgICAgICAgZ2d0aXRsZSgiTWVhbiBvZiBDbHVzdGVyIEFyZWEgU2l6ZSBpbiBEaWZmZXJlbnQgUmF0aW9zIG9mIFNoQi9TaEEgdmFyaWFudHMiKQpCb3hiQXJlYQoKYGBgCgpsYXN0IHBsb3RzIGFyZSBzaG93biwgYm94cGxvdCwgd2hpbGUgdGhlIHgtYXhpcyB0aGlzIHRpbWUgaXMgc2hvd24gYXMgYSBudW1lcmljIChSYXRpbyBvZiBib3RoIHZhcmlhbnRzIHNob3duIGFzIFNoQi9TaEEpLlRoYXQgaXMgdG8gc2VlIGlmIHRoZXJlIGlzIGEgdGVuZGVuY3kvY29ycmVsYXRpb24gYmV0d2VlbiB0aGUgdHJhbnNmaWN0aW9uIHJhdGlvIGFuZCB0aGUgRGVuc2l0eS9BcmVhKQoKYGBge3J9CmlmICgiRGVuc2l0eSIgJWluJSBWYXJpYWJsZVRvQW5hbHl6ZSl7ICNpZiB0aGUgdXNlciB3YW50cyB0byBhbmFseXplIHRoaXMgdmFyaWFibGUsIHRoZSByZXN1bHRzIHNob3cKZGY1IDwtIERhdGEzICU+JQogIGFkZF9jb2x1bW4oLmFmdGVyPTcscmF0aW8gPSBOQSklPiUKICBtdXRhdGUocmF0aW89IGlmZWxzZSggVHJlYXRtZW50ID09IjRTaEErMFNoQitzOTciLDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoVHJlYXRtZW50PT0iMFNoQSs0U2hCK3M5NyIsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFRyZWF0bWVudD09IjJTaEErMlNoQitzOTciLDEvMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFRyZWF0bWVudD09IjFTaEErM1NoQitzOTciLDEvNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShUcmVhdG1lbnQ9PSczU2hBKzFTaEIrczk3JywzLzQscmF0aW8pKSkpKSkKIyBmb3IgdGhlIHN1bW1lcnkgZGF0YSBvZiBEZW5zaXR5OiBhIG5ldyBjb2x1bW4gaXMgYWRkZWQsIGEgbmV3IHByZXNlbnRhdGlvbiBvZiB0aGUgdHJlYXRtZW50IGFzIGEgcmF0aW8gb2YgdGhlIGJvdGggdmFyaWFudHMKYm94RGVuIDwtIGdncGxvdChkZjUsIGFlcyh4ID0gcmF0aW8sZmlsbCA9IHJhdGlvKSkgKwogIGdlb21fYm94cGxvdChhZXMoZ3JvdXAgPSByYXRpbywKICAgICAgbG93ZXIgPSBEZW5zaXR5IC0gc2UsIAogICAgICB1cHBlciA9IERlbnNpdHkgKyBzZSwgCiAgICAgIG1pZGRsZSA9IERlbnNpdHksIAogICAgICB5bWluID0gRGVuc2l0eSAtIDMqc2UsIAogICAgICB5bWF4ID0gRGVuc2l0eSArIDMqc2UpLAogICAgc3RhdCA9ICJpZGVudGl0eSIpICsKICAgICAgICAgICAgbGFicyh4ID0gIkRpZmZlcmVudCByYXRpbyBvZiBCb3RoIFZhcmlhbnRzIFNoQSBhbmQgU2hCIChTaEIvU2hBKSIsCiAgICAgICAgICAgICAgICAgeSA9ICJNZWFuIG9mIENsdXN0ZXJzIERlbnNpdHkgKEEuVS9jbHVzdGVyIGFyZWEgc2l6ZSh1bV4yKSkiKSAgKwogICAgICAgICAgICAgZ2d0aXRsZSgiTWVhbiBvZiBDbHVzdGVycyBEZW5zaXR5IGFzIGEgZnVuY3Rpb24gb2YgU2hCL1NoQSByYXRpbyIpKyB0aGVtZShsZWdlbmQucG9zaXRpb249InJpZ2h0IikKYm94RGVuCn0KaWYgKCJBcmVhIiAlaW4lIFZhcmlhYmxlVG9BbmFseXplKXsgI2lmIHRoZSB1c2VyIHdhbnRzIHRvIGFuYWx5emUgdGhpcyB2YXJpYWJsZSwgdGhlIHJlc3VsdHMgc2hvdwpkZjYgPC0gRGF0YTQgJT4lCiAgYWRkX2NvbHVtbiguYWZ0ZXI9NyxyYXRpbyA9IE5BKSU+JQogIG11dGF0ZShyYXRpbz0gaWZlbHNlKCBUcmVhdG1lbnQgPT0iNFNoQSswU2hCK3M5NyIsMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShUcmVhdG1lbnQ9PSIwU2hBKzRTaEIrczk3IiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoVHJlYXRtZW50PT0iMlNoQSsyU2hCK3M5NyIsMS8yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoVHJlYXRtZW50PT0iMVNoQSszU2hCK3M5NyIsMS80LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFRyZWF0bWVudD09JzNTaEErMVNoQitzOTcnLDMvNCxyYXRpbykpKSkpKQojIGZvciB0aGUgc3VtbWVyeSBkYXRhIG9mIEFyZWE6IGEgbmV3IGNvbHVtbiBpcyBhZGRlZCwgYSBuZXcgcHJlc2VudGF0aW9uIG9mIHRoZSB0cmVhdG1lbnQgYXMgYSByYXRpbyBvZiB0aGUgYm90aCB2YXJpYW50cwojUGxvdHRpbmcgYSBib3hwbG90IG9mIEFyZWEgdmFyaWFibGUgd2hlcmVhcyB0aGUgeC1heGlzIHRoaXMgdGltZSBpcyBhIG51bWVyaWMgdmFyaWFibGUsIHdpdGggdGhlIHN0YW5kYXJkIGVycm9yIHNob3duCmJveEFyZWEgPC0gZ2dwbG90KGRmNiwgYWVzKHggPSByYXRpbyxmaWxsID0gcmF0aW8pKSArCiAgZ2VvbV9ib3hwbG90KGFlcyhncm91cCA9IHJhdGlvLAogICAgICBsb3dlciA9IEFyZWEgLSBzZSwgCiAgICAgIHVwcGVyID0gQXJlYSArIHNlLCAKICAgICAgbWlkZGxlID0gQXJlYSwgCiAgICAgIHltaW4gPSBBcmVhIC0gMypzZSwgCiAgICAgIHltYXggPSBBcmVhICsgMypzZSksCiAgICBzdGF0ID0gImlkZW50aXR5IikgKwogICAgICAgICAgICBsYWJzKHggPSAiRGlmZmVyZW50IFJhdGlvIG9mIEJvdGggVmFyaWFudHMgU2hBIGFuZCBTaEIgKFNoQi9TaEEpIiwKICAgICAgICAgICAgICAgICB5ID0gIk1lYW4gb2YgQ2x1c3RlciBBcmVhIFNpemUodW1eMikpIikgICsKICAgICAgICAgICAgIGdndGl0bGUoIk1lYW4gb2YgQ2x1c3RlciBBcmVhIFNpemUgaW4gRGlmZmVyZW50IFJhdGlvcyBvZiBTaEIvU2hBIHZhcmlhbnRzIikgKyB0aGVtZShsZWdlbmQucG9zaXRpb249InJpZ2h0IikKYm94QXJlYSB9CgpgYGAKCkRlbnNpdHkgZmlsZXMKCmBgYHtyfQp3cml0ZS54bHN4KERhdGEySGFuZGxlW0RhdGEySGFuZGxlJFRyZWF0bWVudD09IjRTaEErMFNoQitzOTciLF0kQXJlYSwiQXJlYV80U2hBKzBTaEIrczk3X3N1bS54bHN4IikKd3JpdGUueGxzeChEYXRhMkhhbmRsZVtEYXRhMkhhbmRsZSRUcmVhdG1lbnQ9PSIzU2hBKzFTaEIrczk3IixdJEFyZWEsIkFyZWFfM1NoQSsxU2hCK3M5N19zdW0ueGxzeCIpCndyaXRlLnhsc3goRGF0YTJIYW5kbGVbRGF0YTJIYW5kbGUkVHJlYXRtZW50PT0iMlNoQSsyU2hCK3M5NyIsXSRBcmVhLCJBcmVhXzJTaEErMlNoQitzOTdfc3VtLnhsc3giKQp3cml0ZS54bHN4KERhdGEySGFuZGxlW0RhdGEySGFuZGxlJFRyZWF0bWVudD09IjFTaEErM1NoQitzOTciLF0kQXJlYSwiQXJlYV8xU2hBKzNTaEIrczk3X3N1bS54bHN4IikKd3JpdGUueGxzeChEYXRhMkhhbmRsZVtEYXRhMkhhbmRsZSRUcmVhdG1lbnQ9PSIwU2hBKzRTaEIrczk3IixdJEFyZWEsIkFyZWFfMFNoQSs0U2hCK3M5N19zdW0ueGxzeCIpCgp3cml0ZS54bHN4KERhdGEySGFuZGxlW0RhdGEySGFuZGxlJFRyZWF0bWVudD09IjRTaEErMFNoQitzOTciLF0kRGVuc2l0eSwiRGVuc2l0eV80U2hBKzBTaEIrczk3X3N1bS54bHN4IikKd3JpdGUueGxzeChEYXRhMkhhbmRsZVtEYXRhMkhhbmRsZSRUcmVhdG1lbnQ9PSIzU2hBKzFTaEIrczk3IixdJERlbnNpdHksIkRlbnNpdHlfM1NoQSsxU2hCK3M5N19zdW0ueGxzeCIpCndyaXRlLnhsc3goRGF0YTJIYW5kbGVbRGF0YTJIYW5kbGUkVHJlYXRtZW50PT0iMlNoQSsyU2hCK3M5NyIsXSREZW5zaXR5LCJEZW5zaXR5XzJTaEErMlNoQitzOTdfc3VtLnhsc3giKQp3cml0ZS54bHN4KERhdGEySGFuZGxlW0RhdGEySGFuZGxlJFRyZWF0bWVudD09IjFTaEErM1NoQitzOTciLF0kRGVuc2l0eSwiRGVuc2l0eV8xU2hBKzNTaEIrczk3X3N1bS54bHN4IikKd3JpdGUueGxzeChEYXRhMkhhbmRsZVtEYXRhMkhhbmRsZSRUcmVhdG1lbnQ9PSIwU2hBKzRTaEIrczk3IixdJERlbnNpdHksIkRlbnNpdHlfMFNoQSs0U2hCK3M5N19zdW0ueGxzeCIpCgoKd3JpdGUueGxzeChDZWxsc0RhdGFDW0NlbGxzRGF0YUMkVHJlYXRtZW50PT0iMFNoQSs0U2hCK3M5NyIsXSRGcmFjdGlvbm9mQ2hhbm5lbHNpbkNsdXN0ZXJzLCJGcmFjdGlvbm9mQ2hhbm5lbHNpbkNsdXN0ZXJzXzBTaEErNFNoQitzOTdfc3VtLnhsc3giKQp3cml0ZS54bHN4KENlbGxzRGF0YUNbQ2VsbHNEYXRhQyRUcmVhdG1lbnQ9PSIxU2hBKzNTaEIrczk3IixdJEZyYWN0aW9ub2ZDaGFubmVsc2luQ2x1c3RlcnMsIkZyYWN0aW9ub2ZDaGFubmVsc2luQ2x1c3RlcnNfMVNoQSszU2hCK3M5N19zdW0ueGxzeCIpCndyaXRlLnhsc3goQ2VsbHNEYXRhQ1tDZWxsc0RhdGFDJFRyZWF0bWVudD09IjJTaEErMlNoQitzOTciLF0kRnJhY3Rpb25vZkNoYW5uZWxzaW5DbHVzdGVycywiRnJhY3Rpb25vZkNoYW5uZWxzaW5DbHVzdGVyc18yU2hBKzJTaEIrczk3X3N1bS54bHN4IikKd3JpdGUueGxzeChDZWxsc0RhdGFDW0NlbGxzRGF0YUMkVHJlYXRtZW50PT0iM1NoQSsxU2hCK3M5NyIsXSRGcmFjdGlvbm9mQ2hhbm5lbHNpbkNsdXN0ZXJzLCJGcmFjdGlvbm9mQ2hhbm5lbHNpbkNsdXN0ZXJzXzNTaEErMVNoQitzOTdfc3VtLnhsc3giKQp3cml0ZS54bHN4KENlbGxzRGF0YUNbQ2VsbHNEYXRhQyRUcmVhdG1lbnQ9PSI0U2hBKzBTaEIrczk3IixdJEZyYWN0aW9ub2ZDaGFubmVsc2luQ2x1c3RlcnMsIkZyYWN0aW9ub2ZDaGFubmVsc2luQ2x1c3RlcnNfNFNoQSswU2hCK3M5N19zdW0ueGxzeCIpCgoKCgp3cml0ZS54bHN4KENlbGxzRGF0YUNbQ2VsbHNEYXRhQyRUcmVhdG1lbnQ9PSIwU2hBKzRTaEIrczk3IixdJENlbGxTdXJmYWNlRXhwcmVzc2lvbiwiQ2VsbFN1cmZhY2VFeHByZXNzaW9uXzBTaEErNFNoQitzOTdfc3VtLnhsc3giKQp3cml0ZS54bHN4KENlbGxzRGF0YUNbQ2VsbHNEYXRhQyRUcmVhdG1lbnQ9PSIxU2hBKzNTaEIrczk3IixdJENlbGxTdXJmYWNlRXhwcmVzc2lvbiwiQ2VsbFN1cmZhY2VFeHByZXNzaW9uXzFTaEErM1NoQitzOTdfc3VtLnhsc3giKQp3cml0ZS54bHN4KENlbGxzRGF0YUNbQ2VsbHNEYXRhQyRUcmVhdG1lbnQ9PSIyU2hBKzJTaEIrczk3IixdJENlbGxTdXJmYWNlRXhwcmVzc2lvbiwiQ2VsbFN1cmZhY2VFeHByZXNzaW9uXzJTaEErMlNoQitzOTdfc3VtLnhsc3giKQp3cml0ZS54bHN4KENlbGxzRGF0YUNbQ2VsbHNEYXRhQyRUcmVhdG1lbnQ9PSIzU2hBKzFTaEIrczk3IixdJENlbGxTdXJmYWNlRXhwcmVzc2lvbiwiQ2VsbFN1cmZhY2VFeHByZXNzaW9uXzNTaEErMVNoQitzOTdfc3VtLnhsc3giKQp3cml0ZS54bHN4KENlbGxzRGF0YUNbQ2VsbHNEYXRhQyRUcmVhdG1lbnQ9PSI0U2hBKzBTaEIrczk3IixdJENlbGxTdXJmYWNlRXhwcmVzc2lvbiwiQ2VsbFN1cmZhY2VFeHByZXNzaW9uXzRTaEErMFNoQitzOTdfc3VtLnhsc3giKQoKCkRhdGE5ID0gc3VtbWFyeVNFKGRhdGE9Q2VsbHNEYXRhQywKICAgICAgICAgICAgICJGcmFjdGlvbm9mQ2hhbm5lbHNpbkNsdXN0ZXJzIiwKICAgICAgICAgICAgIGdyb3VwdmFycz0iVHJlYXRtZW50IiwKICAgICAgICAgICAgIGNvbmYuaW50ZXJ2YWwgPSAwLjk1KSNjcmVhdGluZ2cgYSBuZXcgc3VtbWVyeSBkYXRhZnJhbWUgZ29yIHBsb3R0aW5nIHB1cnBvc2VzCmRhdGFpIDwtIGFzLmRhdGEuZnJhbWUubGlzdChQV0ZyYWN0aW9ub2ZDaGFubmVsc2luQ2x1c3RlcnMkZ3JvdXBzKSMgY2hhbmdpbmcgdGhlIHR1a2V5IHJlc3VsdCBmb3IgdGhpcyB2YXJpYWJsZSBpbnRvIGEgZGF0YWZyYW1lLSBpbiBvcmRlciB0byBleHRyYWN0IHRoZSBncm91cCBmcm9tIGl0LCB3aGl0Y2ggc2hvd3Mgd2V0aGVyIHR3byBsZXZlbHMgd2l0aGluIHRoZSB0ZXN0ZWQgdmFyaWFibGUgZGlmZmVyIHNpZ25pZmljYXRseQpkYXRhaSRUcmVhdG1lbnQgPC0gcm93Lm5hbWVzKFBXRnJhY3Rpb25vZkNoYW5uZWxzaW5DbHVzdGVycyRncm91cHMpI2FkZGluZyBhIGNvbHVtbiBmb3IgdHJlYXRtZXQgZGF0YWksIGZvciB0aGUgbmV4dCBzdGVwCkRhdGE5IDwtIG1lcmdlKERhdGE5LGRhdGFpWywtMV0sIGJ5PSJUcmVhdG1lbnQiKQp3cml0ZS5jc3YoRGF0YTksIkZyYWN0aW9ub2ZDaGFubmVsc2luQ2x1c3RlcnMuY3N2Iiwgcm93Lm5hbWVzID0gVFJVRSkKYGBgCgpBIHNpbXBsZSBsaW5lYXIgcmVncmVzc2lvbiB3aWxsIGJlIHBlcmZvcm1lZCBpbiB0aGlzIGNodW5rLCB0ZXN0aW5nIGZvciB3aGV0aGVyIHRoZSBleHBlY3RlZCB2YWx1ZXMgb2YgdGhlIHRyZWF0bWVudCBwcmVkaWN0cyBzdWNjZXNzZnVsbHkgdGhlIGV4cGVyaW1lbnRhbCBvYnNlcnZlZCBtZWFucyBpbiBlYWNoIHRyZWF0bWVudC4KY3JlYXRpbmcgbmV3IHN1bW1hcml6ZWQgZGF0YSBpZiB0aGUgdmFyaWFibGVzIEFyZWEvRGVuc2l0eSBoYWQgYmVlbiB0cmFuc2Zvcm1lZAoKYGBge3J9CmlmICgiRGVuc2l0eSIgJWluJSBWYXJpYWJsZVRvQW5hbHl6ZSl7ICNpZiB0aGUgdXNlciB3YW50cyB0byBhbmFseXplIHRoaXMgdmFyaWFibGUsIHRoZSByZXN1bHRzIHNob3cKICBpZiAoIkRlbnNpdHkudHJhbnMiICVpbiUgY29sbmFtZXMoRGF0YTJIYW5kbGUpKXsgI2lmIHRoZSBkYXRhIGZvciB2YXJpYWJsZSBEZW5zaXR5IGhhZCBiZWVuIHRyYW5zZm9ybWVkLCB0aGVyZSBpcyBhIGEgbmVlZCB0byBjcmVhdGUgYSBuZXcgc3VtbWFyaXplZCBkYXRhIGZyYW1lIHdpdGggdGhlIHRyYW5zZm9ybWVkIHZhbHVlcy0gc2luY2UgbGluZWFyIHJlZ3Jlc3Npb24gYXNzdW1lIG5vcm1hbGl0eSBhbmQgaG9tb2dlbnR5IG9mIHZhcmlhbmNlcwogIERhdGE1ID0gc3VtbWFyeVNFKGRhdGE9RGF0YTJIYW5kbGUsCiAgICAgICAgICAgICAiRGVuc2l0eS50cmFucyIsCiAgICAgICAgICAgICBncm91cHZhcnM9IlRyZWF0bWVudCIsCiAgICAgICAgICAgICBjb25mLmludGVydmFsID0gMC45NSkgI2NyZWF0aW5nZyBhIG5ldyBzdW1tZXJ5IGRhdGFmcmFtZSBnb3IgcGxvdHRpbmcgcHVycG9zZXMKZGF0YWkgPC0gYXMuZGF0YS5mcmFtZS5saXN0KFBXRGVuc2l0eSRncm91cHMpIyBjaGFuZ2luZyB0aGUgdHVrZXkgcmVzdWx0IGZvciB0aGlzIHZhcmlhYmxlIGludG8gYSBkYXRhZnJhbWUtIGluIG9yZGVyIHRvIGV4dHJhY3QgdGhlIGdyb3VwIGZyb20gaXQsIHdoaXRjaCBzaG93cyB3ZXRoZXIgdHdvIGxldmVscyB3aXRoaW4gdGhlIHRlc3RlZCB2YXJpYWJsZSBkaWZmZXIgc2lnbmlmaWNhdGx5CmRhdGFpJFRyZWF0bWVudCA8LSByb3cubmFtZXMoUFdEZW5zaXR5JGdyb3VwcykjYWRkaW5nIGEgY29sdW1uIGZvciB0cmVhdG1ldCBkYXRhaSwgZm9yIHRoZSBuZXh0IHN0ZXAKRGF0YTUgPC0gbWVyZ2UoRGF0YTUsZGF0YWlbLC0xXSwgYnk9IlRyZWF0bWVudCIpIyBhc3NpZ25pbmcgdGhpcyBpbnRvIHRoZSBzdW1tZXJ5IGRhdGEKbmFtZXMoRGF0YTUpW25hbWVzKERhdGE1KSA9PSAiRGVuc2l0eS50cmFucyJdIDwtICJEZW5zaXR5IiAjY2hhbmdpbmcgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiwgc28gdGhlIHJlc3QgaWYgdGhoZSBjb2RlIGNvdWxkIHJlY29nbml6ZSBib3RoIGlmIHRoZSBjb25kaXRpb25zLSB0cmFuc2Zvcm1lZC9ub3QgdHJhbnNmb3JtZWQgZGF0YQpkZjUgPC0gRGF0YTUgJT4lCiAgYWRkX2NvbHVtbiguYWZ0ZXI9NyxyYXRpbyA9IE5BKSU+JQogIG11dGF0ZShyYXRpbz0gaWZlbHNlKCBUcmVhdG1lbnQgPT0iNFNoQSswU2hCK3M5NyIsMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShUcmVhdG1lbnQ9PSIwU2hBKzRTaEIrczk3IiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoVHJlYXRtZW50PT0iMlNoQSsyU2hCK3M5NyIsMS8yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoVHJlYXRtZW50PT0iMVNoQSszU2hCK3M5NyIsMS80LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFRyZWF0bWVudD09JzNTaEErMVNoQitzOTcnLDMvNCxyYXRpbykpKSkpKSAjYWRkaW5nIHRoZSByYXRpbyBhcyBudW1iZXIgYWNjb3JkaW5nIHRvIHRoZSBuYW1lIG9mIHRoZSB0cmVhdG1lbnQgaW4gYSBuZXcgY29sdW1uLgp9CmVxdWF0aW9uMWV4cEQgPC0gZGY1JHJhdGlvICogZGY1JERlbnNpdHlbNV0JKyAoMS1kZjUkcmF0aW8pKiBkZjUkRGVuc2l0eVsxXSAjY2FsY3VsYXRpbmcgdGhlIGV4cGVjdGVkIHZhbHVlcyBmb3IgZWFjaCB0cmVhdG1lbnQgZm9yIHRoZSBEZW5zaXR5IApkZjUkZXF1YXRpb24xZXhwRCA8LSBlcXVhdGlvbjFleHBEICMgaW5zZXJ0aW5nIHRoZXNlIGV4cGVjdGVkIHZhbHVlcyB0byBkZjUKbW9kZWxEIDwtIGxtKERlbnNpdHl+ZXF1YXRpb24xZXhwRCwgZGF0YT1kZjUpICNwZXJmb3JtaW5nIGxpbmVhciByZWdyZXNzaW9uIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGV4cGVjdGVkIHZhbHVlcyBwcmVkaWN0IHRoZSByZXNwb25zZS10aGUgZXhwZXJpbWVudGFsIGRhdGEuCnByaW50KHN1bW1hcnkobW9kZWxEKSkgI3Nob3dpbmcgdGhlIHJlc3VsdHMKcHJpbnQoc3VtbShtb2RlbEQpKSAjc2hvd2luZyB0aGUgcmVzdWx0cyBpbiBhbm90aGVyIHdheQplZmZlY3RfcGxvdChtb2RlbEQsIHByZWQgPSBlcXVhdGlvbjFleHBELCBpbnRlcnZhbCA9IFRSVUUsIHBsb3QucG9pbnRzID0gVFJVRSkgI3ByZXNlbnRpbmcgdGhlIHJlc3VsdCBpbiBhIGdyYXBoaWNhbCB3YXkKfQppZiAoIkFyZWEiICVpbiUgVmFyaWFibGVUb0FuYWx5emUpeyAjaWYgdGhlIHVzZXIgd2FudHMgdG8gYW5hbHl6ZSB0aGlzIHZhcmlhYmxlLCB0aGUgcmVzdWx0cyBzaG93CiAgaWYgKCJBcmVhLnRyYW5zIiAlaW4lIGNvbG5hbWVzKERhdGEySGFuZGxlKSl7ICNpZiB0aGUgZGF0YSBmb3IgdmFyaWFibGUgQXJlYSBoYWQgYmVlbiB0cmFuc2Zvcm1lZCwgdGhlcmUgaXMgYSBhIG5lZWQgdG8gY3JlYXRlIGEgbmV3IHN1bW1hcml6ZWQgZGF0YSBmcmFtZSB3aXRoIHRoZSB0cmFuc2Zvcm1lZCB2YWx1ZXMtIHNpbmNlIGxpbmVhciByZWdyZXNzaW9uIGFzc3VtZSBub3JtYWxpdHkgYW5kIGhvbW9nZW5laXR5IG9mIHZhcmlhbmNlcwogIERhdGE2ID0gc3VtbWFyeVNFKGRhdGE9RGF0YTJIYW5kbGUsCiAgICAgICAgICAgICAiQXJlYS50cmFucyIsCiAgICAgICAgICAgICBncm91cHZhcnM9IlRyZWF0bWVudCIsCiAgICAgICAgICAgICBjb25mLmludGVydmFsID0gMC45NSkgI2NyZWF0aW5nZyBhIG5ldyBzdW1tZXJ5IGRhdGFmcmFtZSBnb3IgcGxvdHRpbmcgcHVycG9zZXMKZGF0YWkgPC0gYXMuZGF0YS5mcmFtZS5saXN0KFBXRGVuc2l0eSRncm91cHMpICMgY2hhbmdpbmcgdGhlIHR1a2V5IHJlc3VsdCBmb3IgdGhpcyB2YXJpYWJsZSBpbnRvIGEgZGF0YWZyYW1lLSBpbiBvcmRlciB0byBleHRyYWN0IHRoZSBncm91cCBmcm9tIGl0LCB3aGl0Y2ggc2hvd3Mgd2V0aGVyIHR3byBsZXZlbHMgd2l0aGluIHRoZSB0ZXN0ZWQgdmFyaWFibGUgZGlmZmVyIHNpZ25pZmljYXRseQpkYXRhaSRUcmVhdG1lbnQgPC0gcm93Lm5hbWVzKFBXRGVuc2l0eSRncm91cHMpI2FkZGluZyBhIGNvbHVtbiBmb3IgdHJlYXRtZXQgZGF0YWksIGZvciB0aGUgbmV4dCBzdGVwCkRhdGE2IDwtIG1lcmdlKERhdGE2LGRhdGFpWywtMV0sIGJ5PSJUcmVhdG1lbnQiKSMgYXNzaWduaW5nIHRoaXMgaW50byB0aGUgc3VtbWVyeSBkYXRhCm5hbWVzKERhdGE2KVtuYW1lcyhEYXRhNikgPT0gIkFyZWEudHJhbnMiXSA8LSAiQXJlYSIgI2NoYW5naW5nIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4sIHNvIHRoZSByZXN0IGlmIHRoaGUgY29kZSBjb3VsZCByZWNvZ25pemUgYm90aCBpZiB0aGUgY29uZGl0aW9ucy0gdHJhbnNmb3JtZWQvbm90IHRyYW5zZm9ybWVkIGRhdGEKZGY2IDwtIERhdGE2ICU+JQogIGFkZF9jb2x1bW4oLmFmdGVyPTcscmF0aW8gPSBOQSklPiUKICBtdXRhdGUocmF0aW89IGlmZWxzZSggVHJlYXRtZW50ID09IjRTaEErMFNoQitzOTciLDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoVHJlYXRtZW50PT0iMFNoQSs0U2hCK3M5NyIsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFRyZWF0bWVudD09IjJTaEErMlNoQitzOTciLDEvMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFRyZWF0bWVudD09IjFTaEErM1NoQitzOTciLDEvNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShUcmVhdG1lbnQ9PSczU2hBKzFTaEIrczk3JywzLzQscmF0aW8pKSkpKSkgI2FkZGluZyB0aGUgcmF0aW8gYXMgbnVtYmVyIGFjY29yZGluZyB0byB0aGUgbmFtZSBvZiB0aGUgdHJlYXRtZW50IGluIGEgbmV3IGNvbHVtbi4KfQogIGVxdWF0aW9uMWV4cEEgPC0gZGY2JHJhdGlvICogZGY2JEFyZWFbNV0JKyAoMS1kZjYkcmF0aW8pKiBkZjYkQXJlYVsxXSAjY2FsY3VsYXRpbmcgdGhlIGV4cGVjdGVkIHZhbHVlcyBmb3IgZWFjaCB0cmVhdG1lbnQgZm9yIHRoZSBBcmVhCmRmNiRlcXVhdGlvbjFleHBBIDwtIGVxdWF0aW9uMWV4cEEgIyBpbnNlcnRpbmcgdGhlc2UgZXhwZWN0ZWQgdmFsdWVzIHRvIGRmNgptb2RlbEEgPC0gbG0oQXJlYX5lcXVhdGlvbjFleHBBLCBkYXRhPWRmNikgI3BlcmZvcm1pbmcgbGluZWFyIHJlZ3Jlc3Npb24gdG8gY2hlY2sgd2hldGhlciB0aGUgZXhwZWN0ZWQgdmFsdWVzIHByZWRpY3QgdGhlIHJlc3BvbnNlLXRoZSBleHBlcmltZW50YWwgZGF0YS4KcHJpbnQoc3VtbWFyeShtb2RlbEEpKSAjc2hvd2luZyB0aGUgcmVzdWx0cwpwcmludChzdW1tKG1vZGVsQSkpI3Nob3dpbmcgdGhlIHJlc3VsdHMgaW4gYW5vdGhlciB3YXkKZWZmZWN0X3Bsb3QobW9kZWxBLCBwcmVkID0gZXF1YXRpb24xZXhwQSwgaW50ZXJ2YWwgPSBUUlVFLCBwbG90LnBvaW50cyA9IFRSVUUpICNwcmVzZW50aW5nIHRoZSByZXN1bHQgaW4gYSBncmFwaGljYWwgd2F5Cn0KYGBgCgpuZXcKCmBgYHtyfQoKCmhpc3RfYWxsRGVuc2l0eV9wIDwtIGdncGxvdChEYXRhMkhhbmRsZSwgYWVzKERlbnNpdHkvMTAwMDAwMCwgeW1heD0xLjAsIHltaW49MC4wKSkgKwogIGZhY2V0X3dyYXAoflRyZWF0bWVudCwgc2NhbGVzID0gJ2ZyZWVfeCcpICsKICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IHN0YXQoY291bnQpIC8gc3VtKGNvdW50KSxjb2xvciA9IENlbGxOdW1iZXIsIGZpbGwgPSBDZWxsTnVtYmVyKSkrICAKICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDEuMiksCiAgICAgICAgICAgICAgICAgIGZhY2UgPSAiYm9sZCIsIHZqdXN0ID0gMS41LCBoanVzdCA9IDAuNSksCiAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiksCiAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dCh2anVzdD0gMS44KSwKICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHZqdXN0PSAtMC41KSwKICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KCBzaXplPTcpLAogICAgICAgICAgICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICAgICAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwKICAgICAgICAgICAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIpKSsKICAgICAgICAgICAgbGFicyh4ID0gIkRlbnNpdHktSW50ZWdyYXRlZCBJbnRpbnNpdHkqMTBeNiAoKEEuVSkvY2x1c3RlciBhcmVhIHNpemUodW1eMikpIiwKICAgICAgICAgICAgICAgICB5ID0gIlJlbGF0aXZlIGZyZXF1ZW5jeSIpICArCiAgICAgICAgICAgICBnZ3RpdGxlKCJSZWxhdGl2ZSBmcmVxdWVuY3kgb2YgQ2x1c3RlcnMgRGVuc2l0eSIpCmhpc3RfYWxsRGVuc2l0eV9wCmBgYAoKSGVyZSB0aGUgcHJvamVjdCBlbmRzIDopIAo=